Czy próbujesz zamontować katalog w pliku (lub odwrotnie)?

92

Mam dockera z wersją 17.06.0-ce. Kiedy próbuję zainstalować NGINX za pomocą dockera z poleceniem:

docker run -p 80:80 -p 8080:8080 --name nginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs -d nginx:latest

To pokazuje że

docker: odpowiedź na błąd z daemon: oci runtime error: container_linux.go: 262: uruchomienie procesu kontenera spowodowało „process_linux.go: 339: inicjalizacja kontenera spowodowała \” rootfs_linux.go: 57: montaż \\ ”/ appdata / nginx / conf / nginx.conf \\ "do głównego systemu plików \\ "/ var / lib / dokowanym / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\" o \\" / var / lib / dokowanym / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 / itp / nginx / nginx.conf \\ "spowodował \\" nie jest katalogiem \\ "\" ": Czy próbujesz zamontować katalog w pliku (lub odwrotnie)? Sprawdź, czy określona ścieżka hosta istnieje i jest oczekiwanym typem.

Jeśli nie zamontujesz nginx.confpliku, wszystko jest w porządku. Jak więc mogę zamontować plik konfiguracyjny?

Steven Luo
źródło
Jaki jest wynik ls -al .? Chcę zobaczyć, jak wygląda twoje pwd.
Tri Nguyen
1
W moim przypadku przypadkowo zamapowałem katalog z hosta na plik w kontenerze. Ponowne uruchomienie kontenera już nie działało. Musiałem usunąć kontener ( docker rm …), a następnie go odtworzyć.
slhck

Odpowiedzi:

26

Ponieważ doker rozpozna $PWD/conf/nginx.confjako folderu , a nie pliku. Sprawdź, czy $PWD/conf/katalog zawiera nginx.confjako katalog .

Testuj z

> cat $PWD/conf/nginx.conf 
cat: nginx.conf/: Is a directory

W przeciwnym razie otwórz problem z platformą Docker .
U mnie działa dobrze przy tej samej konfiguracji.

Mathieu Lescaudron
źródło
Jako użytkownik Linuksa na średnim poziomie jestem ciekawy, jaki jest powód, dla którego Linux rozpoznaje to jako folder, a nie plik?
J. Scott Elblein
Ponieważ w rzeczywistości jest to folder. Jeśli plik nie istnieje, docker tworzy folder z powodu argumentu woluminu-v
Mathieu Lescaudron
ok, więc Linux rozpoznaje go jako folder tylko wtedy, gdy docker musiał go utworzyć z powodu ścieżki, która wcześniej nie istniała; ale gdyby nginx.confistniał już wcześniej w tej ścieżce, Linux rozpoznałby go jako plik, prawda?
J. Scott Elblein
137

To nie powinno już mieć miejsca (od wersji 2.2.0.0), zobacz tutaj


Jeśli używasz platformy Docker dla systemu Windows , ten błąd może wystąpić, jeśli niedawno zmieniłeś hasło.

Jak naprawić:

  1. Najpierw upewnij się, że usunięto uszkodzony wolumin kontenera
    docker rm -v <container_name>
    Aktualizacja: Poniższe kroki mogą działać bez konieczności wcześniejszego usuwania woluminów.
  2. Otwórz ustawienia platformy Docker
  3. Przejdź do karty „Dyski współdzielone”
  4. Kliknij łącze „Resetuj dane logowania ...” w dolnej części okna
  5. Ponownie udostępnij dyski, których chcesz używać, z Docker
  • Powinien zostać wyświetlony monit o wprowadzenie nazwy użytkownika / hasła
  1. Kliknij „Zastosuj”
  2. Przejdź do zakładki „Resetuj”
  3. Kliknij „Uruchom ponownie Docker”
  4. Utwórz ponownie kontenery / woluminy

Rozwiązanie zasługuje na uznanie dla BaranOrnarli na GitHub.

Jesse Webb
źródło
2
Dzięki! U mnie działa, zaczynając od drugiego kroku i unikając ostatniego.
Mateo Hermosilla,
1
Udało mi się rozwiązać problem, zaczynając od kroku 2, a także pomijając ostatni. Nie musiałem niszczyć pojemników / woluminów, aby ponownie zamontować.
Christian Engel
Zgadzam się z @MateoHermosilla, nie muszę wykrywać kontenera, tylko "Resetuj dane
uwierzytelniające
Otrzymuję ten sam błąd podczas próby uruchomienia proxy-deploy.sh podczas instalowania sandbox-proxy (hadoop). Po tym rozwiązaniu. nie naprawił tego.
Vaibhav,
2
To był problem dla mnie. Resetowanie hasła odbywa się co kilka miesięcy, więc ciągle zapominam o zresetowaniu poświadczeń dysku współdzielonego w Dockerze.
Anders Tornblad
41

TL; DR : Usuń woluminy powiązane z kontenerem.

Znajdź nazwę kontenera za pomocą, docker ps -aa następnie usuń ten kontener za pomocą:

docker rm -v <container_name>

Problem:

Błąd, z którym się spotykasz, może wystąpić, jeśli wcześniej próbowałeś uruchomić docker runpolecenie, gdy plik nie był obecny w lokalizacji, w której powinien znajdować się w katalogu hosta.

W tym przypadku demon Dockera utworzyłby w jego miejscu katalog wewnątrz kontenera, który później nie może mapować do właściwego pliku, gdy poprawne pliki zostaną umieszczone w katalogu hosta i polecenie docker zostanie ponownie uruchomione.

Rozwiązanie:

Usuń woluminy, które są skojarzone z kontenerem. Jeśli nie martwisz się o inne objętości kontenerów, możesz również użyć:

docker volume rm $(docker volume ls -q)
Ayushya
źródło
Polecenie w pierwotnym pytaniu wskazywało tylko woluminy hosta jako używane. docker volumeKomenda / interfejs jest tylko dla anonimowych i nazwanych tomów, które nie należą do pierwotnego pytania.
programmerq
@programmerq Spójrz na błąd, mówi, że montaż nie powiódł się, gdy próbował zamontować w /var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"Moim dedukcji: ma już folder z powodu poprzedniego uruchomienia, więc jeśli spróbujesz zmapować plik do tego folderu, zakończy się niepowodzeniem.
Ayushya
Tutaj dwie rzeczy mogły pójść nie tak, albo host ma złe rzeczy, albo już utworzony wolumen ma nieprawidłową informację. Zakładając, że host ma rację, pomyślałem, że lepiej będzie usunąć problemy z istniejącą głośnością.
Ayushya
1
W rzeczywistości jest to prawidłowa odpowiedź w przypadku, gdy kontener został już powiązany z objętością, a typ tego wolumenu jest zmieniany w następnym przebiegu. Usunięcie głośności może więc pomóc!
Yan Foto
1
To było pomocne. Problem w moim przypadku rzeczywiście polegał na tym, że nadal miałem zdefiniowane stare kontenery. Użycie docker rm do ich zapełnienia, a następnie wykonanie docker-compose działało poprawnie.
Max Tardiveau
7

Odpowiedź dla osób korzystających z Docker Toolbox

Były tu co najmniej 3 odpowiedzi dotykające problemu, ale nie wyjaśniające go poprawnie i nie dające pełnego rozwiązania. To tylko problem z montowaniem folderu .

Opis problemu:

Docker Toolbox omija wymaganie Hyper-V platformy Docker, tworząc maszynę wirtualną (w VirtualBox, który jest dostarczany w pakiecie). Docker jest instalowany i uruchamiany w maszynie wirtualnej. Aby Docker działał poprawnie, musi mieć dostęp do hosta. A tutaj nie.

Po zainstalowaniu Docker Toolbox utworzył C:\Usersmaszynę wirtualną VirtualBox i zamontował ją tylko na maszynie, jako \c\Users\. Mój projekt był C:\projectstak nigdzie na zamontowanym woluminie. Kiedy wysyłałem ścieżkę do maszyny wirtualnej, nie istniałaby, ponieważ C:\projectsnie jest zamontowana. Stąd powyższy błąd.

Powiedzmy, że mam projekt zawierający konfigurację ngnix w formacie C:/projects/project_name/

Naprawić to:

  1. Przejdź do VirtualBox, kliknij prawym przyciskiem myszy Default (VM z Dockera)> Ustawienia> Foldery współdzielone wprowadź opis obrazu tutaj

  2. Klikając małą ikonę z plusem po prawej stronie, Dodaj nowy udział. Użyłem następujących ustawień:

wprowadź opis obrazu tutaj

  1. Powyższe będzie mapowane C:\projectsna /projects( ROOT/projects) w maszynie wirtualnej, co oznacza, że ​​teraz możesz odwoływać się do dowolnej ścieżki w projektach takich jak ten: /projects/project_name- ponieważ project_namefrom C:\projects\project_namejest teraz zamontowany.

Aby użyć ścieżek względnych, rozważ nazwanie ścieżki c/projectsnieprojects

  1. Zrestartuj wszystko i powinno teraz działać poprawnie. Ręcznie zatrzymałem maszynę wirtualną w VirtualBox i ponownie uruchomiłem interfejs wiersza polecenia Docker Toolbox.

W moim pliku Dockera odwołuję się teraz do nginx.conftego:

volumes:
    - /projects/project_name/docker_config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf

Gdzie faktycznie znajduje się nginx.conf C:\projects\project_name\docker_config\nginx\nginx.conf

viorel
źródło
7

Wyjaśnienie podane przez @Ayushya było powodem, dla którego trafiłem na ten nieco mylący komunikat o błędzie, a niezbędne sprzątanie można łatwo wykonać w ten sposób:

$ docker container prune
$ docker volume prune
Andy Brown
źródło
6

Miałem ten sam problem. Używałem Docker Desktop z WSL w Windows 10 17.09.

Przyczyna problemu:

Problem polega na tym, że Docker dla Windows oczekuje podania ścieżek woluminów w formacie, który pasuje do tego:

/c/Users/username/app

ALE, WSL zamiast tego używa formatu:

/mnt/c/Users/username/app

To jest mylące, ponieważ sprawdzając plik w konsoli widziałem go i u mnie wszystko było w porządku. Nie byłem świadomy oczekiwań platformy Docker for Windows dotyczących ścieżek woluminów .

Rozwiązaniem problemu:

Powiązałem niestandardowe punkty montowania, aby naprawić różnice między Docker dla Windows i WSL:

sudo mount --bind /mnt/c /c

Jak zasugerowano w tym niesamowitym przewodniku: Konfiguracja Dockera dla Windows i WSL, aby działały bezbłędnie i wszystko działa teraz idealnie.

Zanim zacząłem używać WSL, korzystałem z Git Bash i miałem również ten problem.

webcu
źródło
1
Więcej szczegółów tutaj: github.com/10up/wp-local-docker/issues/…
nbeuchat
4

Używam Docker ToolBox dla Windows. Domyślnie dysk C jest montowany automatycznie, więc aby zamontować pliki, upewnij się, że pliki i foldery znajdują się wewnątrz dysku C DRIVE .

Przykład: C:\Users\%USERNAME%\Desktop

Abhishek DK
źródło
1
mój zamontowany folder to C: \ x-suite \; Udostępniłem dysk C
,,
czy używasz Docker ToolBox?
Abhishek DK
minikube + virtualBox + docker ToolBox, localkube jest przestarzałe, jakiego sterownika mam użyć?
袁文涛
jeśli montujesz z Dockercompose, użyj $ {pwd} / <path>
Abhishek DK
1
jeśli robisz w Dockerfile, użyj VOLUME / c / x-suite
Abhishek DK
2

Może ktoś uzna to za przydatne. Mój plik redagowania miał zamontowany następujący wolumin

./file:/dir/file

Ponieważ ./file nie istniał, został zamontowany w ABC (domyślnie jako folder).

W moim przypadku miałem pojemnik wynikający z

docker commit ABC cool_image

Kiedy później utworzyłem ./file i uruchomiłem docker-compose up, wystąpił błąd:

[...] Czy próbujesz zamontować katalog w pliku (lub odwrotnie)? Sprawdź, czy określona ścieżka hosta istnieje i jest oczekiwanym typem.

Kontener wywołany z cool_imagezapamiętanego, że /dir/filebył katalogiem i był w konflikcie z ostatnio utworzonym i zamontowanym ./file.

Rozwiązaniem było:

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image
Yuriy Pozniak
źródło
Dziękuję, to też był mój problem, ponieważ mam dość złożoną konfigurację Dockera!
rmcsharry
1

W systemie Windows 10 po prostu otrzymuję ten błąd bez zmiany czegokolwiek w moim docker-compose.ymlpliku lub ogólnie w konfiguracji Dockera.

W moim przypadku używałem VPN z polityką zapory, która blokuje port 445.

Po odłączeniu się od VPN problem znika.

Dlatego radzę sprawdzić zaporę i nie używać serwera proxy ani VPN podczas uruchamiania Docker Desktop.

Sprawdź Docker dla systemu Windows - reguły zapory dla dysków współdzielonych, aby uzyskać więcej informacji.

Mam nadzieję, że to pomoże komuś innemu.

Mohammed Réda OUASSINI
źródło
1

Czy mógłbyś zamiast tego użyć ścieżki bezwzględnej / pełnej $PWD/conf/nginx.conf? Wtedy zadziała.

EX:docker run --name nginx-container5 --rm  -v /home/sree/html/nginx.conf:/etc/nginx/nginx.conf -d -p 90:80 nginx
b9ead15988a93bf8593c013b6c27294d38a2a40f4ac75b1c1ee362de4723765b

root@sree-VirtualBox:/home/sree/html# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
b9ead15988a9        nginx               "nginx -g 'daemon of…"   7 seconds ago       Up 6 seconds        0.0.0.0:90->80/tcp   nginx-container5
e2b195a691a4        nginx               "/bin/bash"              16 minutes ago      Up 16 minutes       0.0.0.0:80->80/tcp   test-nginx
Srikanth Muppalaneni
źródło
jeśli zmienisz go w cudzysłowy: docker run -d --rm -v "$ PWD / nginx.conf: /etc/nginx/nginx.conf" nginx nie powinno to robić różnicy, ponieważ powłoka przetłumaczy to przed przekazaniem do docker run i właściwie to nie robi różnicy, przynajmniej dla mnie
Manumie
1

Doświadczyłem tego samego problemu, używając Dockera nad WSL1 w systemie Windows 10 z tym wierszem poleceń:

echo $PWD
/mnt/d/nginx

docker run --name nginx -d \
  -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

Rozwiązałem ten problem, zmieniając ścieżkę do pliku w systemie hosta na ścieżkę bezwzględną w stylu UNIX:

docker run --name nginx -d \
  -v /d/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx

lub używając ścieżki bezwzględnej w stylu Windows z /zamiast \jako separatory ścieżek:

docker run --name nginx -d \
  -v D:/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx
bwibo
źródło
Czy zauważyłeś jakieś różnice w wydajności podczas korzystania ze ścieżki stylu systemu Windows i ścieżki w stylu uniksowym?
J. Scott Elblein
Nie mogę powiedzieć. Po prostu używam Dockera dla Windows do testowania / programowania i nigdy nie monitorowałem wydajności.
bwibo
0

Aktualizacja programu Virtual Box do wersji 6.0.10 rozwiązała ten problem w programie Docker Toolbox

https://github.com/docker/toolbox/issues/844

Wystąpił ten rodzaj błędu:


mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ touch resolv.conf

mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv.conf ubuntu /bin/bash
C:\Program Files\Docker Toolbox\docker.exe: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/c/Users/mlepisto/G/Projects/resolv.conf\\\" to rootfs \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged\\\" at \\\"/mnt/sda1/var/lib/docker/overlay2/61eabcfe9ed7e4a87f40bcf93c2a7d320a5f96bf241b2cf694a064b46c11db3f/merged/etc/resolv.conf\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.

# mounting to some other file name inside the container did work just fine
mlepisto@DESKTOP-VKJ76GO MINGW64 ~/G/Projects/
$ docker run --rm -it -v $PWD/resolv.conf:/etc/resolv2.conf ubuntu /bin/bash
root@a5020b4d6cc2:/# exit
exit

Po aktualizacji VitualBox wszystkie polecenia działały dobrze 🎉

Mikael Lepistö
źródło
0

Miałem tę samą rysę głowy, ponieważ nie miałem pliku lokalnie, więc utworzył go jako folder.

mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile
mimas@Anttis-MBP:~/random/dockerize/tube$ docker run --rm -v $(pwd)/logs.txt:/usr/app/logs.txt devopsdockeruh/first_volume_exercise
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "process_linux.go:430: container init caused \"rootfs_linux.go:58: mounting \\\"/Users/mimas/random/dockerize/tube/logs.txt\\\" to rootfs \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged\\\" at \\\"/var/lib/docker/overlay2/75891ea3688c58afb8f0fddcc977c78d0ac72334e4c88c80d7cdaa50624e688e/merged/usr/app/logs.txt\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
mimas@Anttis-MBP:~/random/dockerize/tube$ ls
Dockerfile  logs.txt/
t0rjantai
źródło
0

nieznane: Czy próbujesz zamontować katalog w pliku (lub odwrotnie)? Sprawdź, czy określona ścieżka hosta istnieje i jest oczekiwanym typem

Miałem podobny błąd na niginx w środowisku Mac. Docker nie rozpoznał poprawnie pliku default.conf. Po zmianie ścieżki względnej na ścieżkę bezwzględną błąd został naprawiony.

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
simpleDrinker
źródło
0

U mnie to nie zadziałało:

volumes:
  - ./:/var/www/html
  - ./nginx.conf:/etc/nginx/conf.d/site.conf

Ale to działa dobrze (oczywiście przeniosłem również mój plik konfiguracyjny do nowego katalogu:

volumes:
  - ./:/var/www/html
  - ./nginx/nginx.conf:/etc/nginx/conf.d/site.conf
Jon Winstanley
źródło
0

Podzielę się tutaj moją sprawą, ponieważ może to zaoszczędzić dużo czasu komuś innemu w przyszłości.

Miałem doskonale działającego docker-compose na moich macos, dopóki nie zacząłem używać docker-in-docker w Gitlab CI. Otrzymałem tylko uprawnienia do pracy jako Master w repozytorium, a Gitlab CI jest samodzielnie hostowany i konfigurowany przez kogoś innego i żadne inne informacje nie zostały udostępnione, o tym, jak to jest skonfigurowane itp.

Problem spowodował:

volumes:
  - ./.docker/nginx/wordpress/wordpress.conf:/etc/nginx/conf.d/default.conf

Dopiero gdy zauważyłem, że może to działać pod oknami (godziny drapania po głowie), próbowałem zmienić nazwę wodpress.conf na default.conf i po prostu ustawić ścieżki katalogowe:

volumes:
  - ./.docker/nginx/wordpress:/etc/nginx/conf.d

To rozwiązało problem!

punkbit
źródło
0

Miałem ten problem pod Windows 7, ponieważ mój plik dockerfile znajdował się na innym dysku.

Oto, co zrobiłem, aby rozwiązać problem:

  1. Otwórz VirtualBox Manager
  2. Wybierz „domyślny” kontener i edytuj ustawienia.
  3. Wybierz Udostępnione foldery i kliknij ikonę, aby dodać nowy udostępniony folder
  4. Ścieżka do folderu: x: \
  5. Nazwa folderu: / x
  6. Sprawdź Auto-mount i Make permanent
  7. Uruchom ponownie maszynę wirtualną

W tym momencie docker-compose uppowinno działać.

pbarney
źródło
0

Otrzymałem ten sam błąd na Windows10 po aktualizacji Dockera: 2.3.0.2 (45183).

... spowodował \\\"not a directory\\\"\"":nieznane: Czy próbujesz zamontować katalog w pliku (lub odwrotnie)? Sprawdź, czy określona ścieżka hosta istnieje i jest oczekiwanym typem

Używałem takich absolutnych ścieżek //C/workspace/nginx/nginx.confi wszystko działało jak urok.
Aktualizacja zepsuła mój docker-compose i musiałem zmienić ścieżki na /C/workspace/nginx/nginx.confjedną /dla katalogu głównego.

ymoreau
źródło
0

Zauważ, że taka sytuacja wystąpi również, jeśli spróbujesz zamontować wolumin z hosta, który nie został dodany do sekcji Zasoby> Udostępnianie plików w Preferencjach Dockera.

wprowadź opis obrazu tutaj

Dodanie ścieżki głównej jako zasobu udostępniania plików umożliwi teraz platformie Docker dostęp do zasobu w celu zamontowania go w kontenerze. Pamiętaj, że może być konieczne wymazanie zawartości kontenera Docker, aby spróbować ponownie zamontować wolumin.

Na przykład, jeśli Twoja aplikacja znajduje się pod adresem /mysites/myapp, będziesz chciał dodać /mysitesjako lokalizację zasobów udostępniania plików.

Mark Shust z M.academy
źródło
0

Miałem ten sam problem, docker-compose tworzył katalog zamiast pliku, a następnie zawieszał się w połowie.

Co ja zrobiłem:

  1. Uruchom kontener bez żadnego mapowania.

  2. Skopiuj .confplik do lokalizacji hosta:

    docker cp containername:/etc/nginx/nginx.conf ./nginx.conf

  3. Wyjmij pojemnik ( docker-compose down).

  4. Odłóż mapowanie z powrotem.

  5. Ponownie zamontuj pojemnik.

Docker Compose znajdzie .confplik i zamapuje go, zamiast próbować utworzyć katalog .

Chtiwi Malek
źródło
-2

Rozwiązałem problem z montowaniem. Używam środowiska Win 7 i ten sam problem mnie spotkał.

Czy próbujesz zamontować katalog w pliku?

Kontener ma domyślny katalog synchronizacji w C:\Users\, więc przeniosłem projekt do C:\Users\, a następnie ponownie utworzyłem projekt. Teraz działa.

dan mu
źródło