Usiłuję dokować aplikację PHP. W pliku dokera pobieram archiwum, rozpakowuję go itp.
Wszystko działa dobrze, jednak jeśli zostanie wydana nowa wersja i zaktualizuję plik docker, muszę ponownie zainstalować aplikację, ponieważ plik config.php zostanie nadpisany.
Pomyślałem więc, że mogę zamontować plik jako wolumin, tak jak w przypadku bazy danych.
Próbowałem na dwa sposoby, z woluminem i bezpośrednią ścieżką.
dokowanie-komponowanie:
version: '2'
services:
app:
build: src
ports:
- "8080:80"
depends_on:
- mysql
volumes:
- app-conf:/var/www/html/upload
- app-conf:/var/www/html/config.php
environment:
DB_TYPE: mysql
DB_MANAGER: MysqlManager
mysql:
image: mysql:5.6
container_name: mysql
volumes:
- mysqldata:/var/lib/mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE:
MYSQL_USER:
MYSQL_PASSWORD:
volumes:
mysqldata:
app-conf:
Co powoduje błąd:
I próbowałem z podaną ścieżką, jako zamontowany wolumin.
/src/docker/myapp/upload:/var/www/html/upload
/src/docker/myapp/upload:/var/www/html/config.php
Jednak oba sposoby nie działają. Po zamontowaniu woluminu widzę, że przesyłanie jest tworzone.
Ale potem się nie udaje
/var/www/html/config.php \\ „spowodował \\” nie katalog \\ "\"
Jeśli spróbuję
/src/docker/myapp/upload/config.php:/var/www/html/config.php
Docker tworzy folder przesyłania, a następnie folder config.php. Nie plik.
Czy istnieje inny sposób na utrwalenie konfiguracji?
źródło
Odpowiedzi:
Woluminy plików są wykonywane w ten sposób w oknie dokowanym (przykład ścieżki bezwzględnej (można użyć zmiennych env) i należy podać nazwę pliku):
Możesz także:
Jeśli uruchomisz okno dokowane-komponuj z
/src/docker/myapp
folderuźródło
Cierpiałem na podobny problem. Próbowałem zaimportować mój plik konfiguracyjny do mojego kontenera, aby móc go naprawić za każdym razem, gdy potrzebuję, bez ponownego budowania obrazu.
Mam na myśli, że myślałem, że poniższe polecenie
$(pwd)/config.py
zamapuje z hosta Dockera/root/app/config.py
na kontener jako plik.Jednak zawsze tworzył katalog o nazwie
config.py
, a nie plik.szukając wskazówek, znalazłem przyczynę ( stąd )
Dlatego zawsze jest tworzony jako katalog, ponieważ mój host dokera nie ma go
$(pwd)/config.py
.Nawet jeśli utworzę config.py na hoście dokera.
$(pwd)/config.py
po prostu overwirte/root/app/config.py
nie eksportuje/root/app/config.py
.źródło
touch path/to/file
wDockerfile
tak że kiedy zamontować to i tak będzie to plik (a nie stworzony dir):
musi być pełną ścieżką. Działa w ten sposóbtouch
Była odpowiedź, to zrobić w Dockerfile wówczas objętość doker-komponować zamontować będzie działać poprawnie bez tworzenia katalogówUżyj mount (
--mount
) zamiast volume (-v
)Więcej informacji: https://docs.docker.com/storage/bind-mounts/
Przykład:
Upewnij się, że na hoście dokera istnieje plik /tmp/a.txt
źródło
--mount
i-v
jest zachowanie, gdy część hosta woluminu jeszcze nie istnieje. Zgodnie z linkiem:> Jeśli użyjesz opcji -v lub --volume, aby podłączyć-mount plik lub katalog, który jeszcze nie istnieje na hoście Docker, opcja -v utworzy punkt końcowy. Zawsze jest tworzony jako katalog.Dla każdego, kto używa kontenera Windows takiego jak ja, wiedz, że NIE MOŻESZ powiązać ani zamontować pojedynczych plików za pomocą kontenera Windows.
Trudno to dostrzec, ale tam jest
Link do problemu Github dotyczącego mapowania plików do kontenera Windows
źródło
Sposób, który działał dla mnie, to użycie
bind
wierzchowcaDzięki rasie mike za odpowiedź na: Zamontuj pojedynczy plik z woluminu za pomocą docker-compose
Musisz użyć „długiej składni”, aby wyrazić
bind
mocowanie: https://docs.docker.com/compose/compose-file/#long-syntaxźródło
Możesz również użyć ścieżki względnej do swojego
docker-compose.yml
pliku w ten sposób (testowany na hoście Windows, kontener Linux):źródło
version: '3.7'
określonym wdocker-compose.yml
pliku z wersją dokującą-kompozycję w wersji 1.24.1, kompilacją 4667896b i działało.Począwszy od wersji skomponowanej przez dokera w wersji 3.2 można określić podłączenie woluminu typu „bind” (zamiast domyślnego typu „wolumin”), które pozwala zamontować pojedynczy plik w kontenerze. Wyszukaj „bind mount” w dokumenatowych dokumentach woluminów: https://docs.docker.com/compose/compose-file/#volumes
W moim przypadku próbowałem zamontować pojedynczy plik „.secrets” w mojej aplikacji, który zawierał sekrety tylko dla lokalnego programowania i testowania. Podczas produkcji moja aplikacja pobiera te sekrety z AWS.
Jeśli podłączyłem ten plik jako wolumin przy użyciu skróconej składni:
Docker utworzyłby katalog „.secrets” w kontenerze zamiast do pliku poza kontenerem. Mój kod wygenerowałby wówczas błąd taki jak „IsADirectoryError: [Errno 21] To katalog:„ .secrets ””.
Naprawiłem to, używając zamiast tego składni długiej ręki, określając mój plik sekretów za pomocą montowania woluminu „bind” tylko do odczytu:
Teraz Docker poprawnie montuje mój plik .secrets w kontenerze, tworząc plik w kontenerze zamiast katalogu. Mam nadzieję, że inni uznają ten przykład za pomocny!
źródło
Dla mnie problemem było to, że miałem uszkodzony symboliczny link w pliku, który próbowałem zamontować w kontenerze
źródło
Miałem ten sam problem w systemie Windows
Docker 18.06.1-ce-win73 (19507)
.Usunięcie i ponowne dodanie udostępnionego dysku za pomocą panelu ustawień Dockera i wszystko działało ponownie.
źródło
W systemie Windows, jeśli potrzebujesz zmiennej env $ {PWD} w pliku docker-compose.yml, możesz utworzyć plik .env w tym samym katalogu, co plik docker-compose.yml, a następnie ręcznie wstaw lokalizację folderu.
CMD (pwd_var.bat):
PowerShell (pwd_var.ps1):
Jest więcej dobrych funkcji, które można usłyszeć w przypadku zmiennych .env w oknie dokowanym: https://docs.docker.com/compose/reference/envvars/, szczególnie w przypadku
COMPOSE_CONVERT_WINDOWS_PATHS
zmiennej env, która pozwala komponentowi docker zaakceptować ścieżkę systemu Windows za pomocą baskslash"\"
.Jeśli chcesz udostępnić plik w systemie Windows, plik musi istnieć przed udostępnieniem go kontenerowi.
źródło
Może to komuś pomaga.
Miałem ten problem i próbowałem wszystkiego. Powiązania woluminów wyglądały dobrze i nawet jeśli podłączyłem katalog (nie pliki), miałem nazwy plików w katalogu zamontowanym poprawnie, ale zamontowane jako katalogi.
Próbowałem ponownie włączyć dyski współdzielone i Docker narzekał, że zapora jest aktywna.
Po wyłączeniu zapory wszystko działało dobrze.
źródło
Możesz montować pliki lub katalogi / foldery, wszystko zależy od pliku źródłowego lub katalogu. Musisz także podać pełną ścieżkę lub jeśli nie masz pewności, czy możesz użyć PWD. Oto prosty działający przykład.
W tym przykładzie instaluję plik poleceń env, który już istnieje w moim katalogu roboczym
źródło
Mam ten sam problem w moim systemie Windows 8.1
Okazało się, że było to spowodowane rozróżnianiem wielkości liter w ścieżce. Zadzwoniłem
docker-compose up
z katalogucd /c/users/alex/
i wewnątrz kontenera plik został zamieniony w katalog.Ale kiedy to zrobiłem
cd /c/Users/alex/
(nie użytkownicy pisali wielkie litery) i zadzwoniłemdocker-compose up
stamtąd, zadziałało.W moim systemie zarówno katalog użytkowników, jak i katalog Alexa są pisane dużymi literami, choć wydaje się, że tylko katalog użytkowników ma znaczenie.
źródło