Apakah Anda mencoba memasang direktori ke file (atau sebaliknya)?

92

Saya memiliki buruh pelabuhan dengan versi 17.06.0-ce. Ketika saya mencoba menginstal NGINX menggunakan buruh pelabuhan dengan perintah:

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

Itu menunjukkan bahwa

buruh pelabuhan: Tanggapan kesalahan dari daemon: oci runtime error: container_linux.go: 262: memulai proses penampung menyebabkan "process_linux.go: 339: init container menyebabkan \" rootfs_linux.go: 57: mount \\ "/ appdata / nginx / conf / nginx.conf \\ "untuk rootfs \\ "/ var / lib / buruh pelabuhan / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\" di \\" / var / lib / buruh pelabuhan / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 / etc / nginx / nginx.conf \\ "menyebabkan \\" bukan direktori \\ "\" ": Apakah Anda mencoba memasang direktori ke file (atau sebaliknya)? Periksa apakah jalur host yang ditentukan ada dan merupakan tipe yang diharapkan.

Jika tidak me-mount nginx.conffile tersebut, semuanya baik-baik saja. Jadi, bagaimana cara memasang file konfigurasi?

Steven Luo
sumber
Apa keluaran dari ls -al .? Ingin melihat seperti apa pwd Anda.
Tri Nguyen
1
Dalam kasus saya, saya tidak sengaja memetakan direktori dari host ke file dalam wadah. Memulai ulang penampung tidak berfungsi lagi. Saya harus menghapus container ( docker rm …), lalu membuatnya kembali.
slhck

Jawaban:

26

Karena buruh pelabuhan akan mengenali $PWD/conf/nginx.confsebagai folder dan bukan sebagai file. Periksa apakah $PWD/conf/direktori tersebut berisi nginx.confsebagai direktori .

Uji dengan

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

Jika tidak, buka masalah Docker .
Ini berfungsi dengan baik untuk saya dengan konfigurasi yang sama.

Mathieu Lescaudron
sumber
Sebagai pengguna Linux tingkat menengah, saya penasaran, apa alasan Linux mengenalinya sebagai folder dan bukan file?
J. Scott Elblein
Karena ini sebenarnya folder. Jika file tidak ada, buruh pelabuhan membuat folder karena argumen volume-v
Mathieu Lescaudron
ok, jadi Linux hanya mengenalinya sebagai folder jika buruh pelabuhan harus membuatnya karena jalur yang sebelumnya tidak ada; tetapi jika nginx.confsebelumnya sudah ada di jalur itu Linux akan mengenalinya sebagai file, bukan?
J. Scott Elblein
137

Ini seharusnya tidak lagi terjadi (sejak v2.2.0.0), lihat di sini


Jika Anda menggunakan Docker untuk Windows , kesalahan ini dapat terjadi jika Anda baru saja mengubah kata sandi.

Bagaimana cara memperbaiki:

  1. Pertama-tama, pastikan untuk menghapus Pembaruan volume wadah yang rusak
    docker rm -v <container_name>
    : Langkah-langkah di bawah ini dapat berfungsi tanpa perlu menghapus volume terlebih dahulu.
  2. Buka Pengaturan Docker
  3. Buka tab "Drive Bersama"
  4. Klik tautan "Setel Ulang Kredensial ..." di bagian bawah jendela
  5. Bagikan ulang drive yang ingin Anda gunakan dengan Docker
  • Anda akan diminta untuk memasukkan nama pengguna / kata sandi Anda
  1. Klik "Terapkan"
  2. Buka tab "Reset"
  3. Klik "Mulai Ulang Docker"
  4. Buat ulang kontainer / volume Anda

Kredit diberikan kepada BaranOrnarli di GitHub untuk solusinya.

Jesse Webb
sumber
2
Terima kasih! Ini berfungsi untuk saya mulai dari langkah kedua dan menghindari yang terakhir.
Mateo Hermosilla
1
Saya dapat memperbaiki masalah dengan memulai pada langkah 2 dan juga menghilangkan yang terakhir. Saya tidak perlu menghancurkan container / volume untuk me-mount lagi.
Christian Engel
Saya setuju dengan @MateoHermosilla, tidak perlu mendeteksi penampungnya, hanya "Setel Ulang Kredensial"
sintetico82
Saya mendapatkan kesalahan yang sama saat mencoba menjalankan proxy-deploy.sh saat memasang sandbox-proxy (hadoop). Mengikuti soln ini. tidak memperbaikinya.
Vaibhav
2
Ini adalah masalah saya. Penyetelan ulang kata sandi dilakukan setiap beberapa bulan, jadi saya terus lupa untuk mengatur ulang kredensial Drive Bersama di Docker.
Anders Tornblad
41

TL; DR : Hapus volume yang terkait dengan wadah.

Temukan nama penampung menggunakan docker ps -akemudian hapus penampung itu menggunakan:

docker rm -v <container_name>

Masalah:

Kesalahan yang Anda hadapi mungkin terjadi jika Anda sebelumnya mencoba menjalankan docker runperintah saat file tidak ada di lokasi yang seharusnya ada di direktori host.

Dalam hal ini daemon buruh pelabuhan akan membuat direktori di dalam wadah sebagai gantinya, yang kemudian gagal untuk memetakan ke file yang tepat ketika file yang benar dimasukkan ke dalam direktori host dan perintah buruh pelabuhan dijalankan lagi.

Larutan:

Hapus volume yang terkait dengan wadah. Jika Anda tidak mengkhawatirkan volume kontainer lainnya, Anda juga dapat menggunakan:

docker volume rm $(docker volume ls -q)
Ayushya
sumber
Perintah dalam pertanyaan awal hanya mencantumkan volume host yang digunakan. The docker volumeperintah / interface hanya untuk anonim dan bernama volume, yang bukan bagian dari pertanyaan awal.
programmerq
@programmerq Lihat kesalahannya, dikatakan bahwa mount gagal ketika mencoba me-mount di Deduction /var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\"saya: Ini sudah memiliki folder karena proses sebelumnya, jadi jika Anda mencoba memetakan file ke folder itu, itu akan gagal.
Ayushya
Di sini dua hal mungkin salah, baik host memiliki hal yang salah, atau volume yang sudah dibuat memiliki hal yang salah. Dengan asumsi tuan rumah benar, saya pikir akan lebih baik untuk menyelesaikan masalah dengan volume yang ada.
Ayushya
1
Ini sebenarnya adalah jawaban yang valid untuk saat wadah telah dikaitkan dengan volume dan jenis volume itu sedang diubah di proses berikutnya. Jadi menghapus volume mungkin membantu!
Yan Foto
1
Ini sangat membantu. Masalah dalam kasus saya memang bahwa saya memiliki kontainer lama yang masih ditentukan. Menggunakan buruh pelabuhan untuk memindahkan mereka dan kemudian melakukan pembuatan buruh pelabuhan bekerja dengan benar.
Max Tardiveau
7

Jawaban untuk orang-orang yang menggunakan Docker Toolbox

Setidaknya sudah ada 3 jawaban disini yang menyentuh masalah tersebut, namun tidak menjelaskannya dengan benar dan tidak memberikan solusi yang lengkap. Ini hanya masalah pemasangan folder .

Deskripsi masalah:

Docker Toolbox melewati persyaratan Hyper-V dari Docker dengan membuat mesin virtual (di VirtualBox, yang dibundel). Docker diinstal dan dijalankan di dalam VM. Agar Docker berfungsi dengan baik, Docker harus memiliki akses ke dari mesin host. Yang mana di sini tidak.

Setelah saya menginstal Docker Toolbox, itu membuat VM VirtualBox dan hanya dipasang C:\Userske mesin, sebagai \c\Users\. Proyek saya tidak ada di C:\projectsmana-mana pada volume yang terpasang. Ketika saya mengirim jalur ke VM, itu tidak akan ada, karena C:\projectstidak dipasang. Makanya, kesalahan di atas.

Katakanlah saya memiliki proyek saya yang berisi konfigurasi ngnix saya C:/projects/project_name/

Memperbaiki itu:

  1. Buka VirtualBox, klik kanan pada Default (VM dari Docker)> Pengaturan> Folder Bersama masukkan deskripsi gambar di sini

  2. Mengklik ikon kecil dengan plus di sisi kanan, Tambahkan share baru. Saya menggunakan pengaturan berikut:

masukkan deskripsi gambar di sini

  1. Hal di atas akan memetakan C:\projectske /projects( ROOT/projects) di VM, artinya sekarang Anda dapat mereferensikan jalur mana pun dalam proyek seperti ini: /projects/project_name- karena project_namefrom C:\projects\project_namesekarang sudah terpasang.

Untuk menggunakan path relatif, silakan mempertimbangkan penamaan jalan c/projectstidakprojects

  1. Mulai ulang semuanya dan sekarang seharusnya berfungsi dengan benar. Saya secara manual menghentikan mesin virtual di VirtualBox dan memulai ulang Docker Toolbox CLI.

Di file buruh pelabuhan saya, sekarang saya mereferensikan nginx.confseperti ini:

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

Di mana nginx.conf sebenarnya berada C:\projects\project_name\docker_config\nginx\nginx.conf

viorel
sumber
7

Penjelasan yang diberikan oleh @Ayushya adalah alasan saya mendapatkan pesan kesalahan yang agak membingungkan ini dan pembersihan yang diperlukan dapat dilakukan dengan mudah seperti ini:

$ docker container prune
$ docker volume prune
Andy Brown
sumber
6

Saya memiliki masalah yang sama. Saya menggunakan Docker Desktop dengan WSL di Windows 10 17.09.

Penyebab masalah:

Masalahnya adalah Docker untuk Windows mengharapkan Anda untuk menyediakan jalur volume Anda dalam format yang cocok dengan ini:

/c/Users/username/app

TAPI, WSL malah menggunakan format:

/mnt/c/Users/username/app

Ini membingungkan karena ketika memeriksa file di konsol saya melihatnya, dan bagi saya semuanya sudah benar. Saya tidak mengetahui ekspektasi Docker untuk Windows tentang jalur volume .

Solusi untuk masalah ini:

Saya mengikat titik pemasangan khusus untuk memperbaiki perbedaan Docker untuk Windows dan WSL:

sudo mount --bind /mnt/c /c

Seperti yang disarankan dalam panduan luar biasa ini: Menyiapkan Docker untuk Windows dan WSL agar Bekerja dengan Sempurna dan semuanya bekerja dengan sempurna sekarang.

Sebelum saya mulai menggunakan WSL, saya menggunakan Git Bash dan saya juga mengalami masalah ini.

webcu
sumber
1
Detail lebih lanjut di sini: github.com/10up/wp-local-docker/issues/…
nbeuchat
4

Saya menggunakan Docker ToolBox untuk Windows. Secara default, Drive C dipasang secara otomatis, jadi untuk memasang file, pastikan file dan folder Anda berada di dalam C DRIVE .

Contoh: C:\Users\%USERNAME%\Desktop

Abhishek DK
sumber
1
folder saya yang terpasang adalah C: \ x-suite \; Saya membagikan drive C saya, tetapi masih belum menyelesaikan masalah saya
袁文涛
apakah Anda menggunakan Docker ToolBox?
Abhishek DK
minikube + virtualBox + docker ToolBox, localkube sudah tidak digunakan lagi, driver apa yang harus saya gunakan?
袁文涛
jika Anda memasang dari Dockercompose, gunakan $ {pwd} / <path>
Abhishek DK
1
jika Anda melakukan di Dockerfile, maka gunakan VOLUME / c / x-suite
Abhishek DK
2

Mungkin seseorang menganggap ini berguna. File tulis saya memiliki volume berikut yang dipasang

./file:/dir/file

Karena ./file tidak ada, itu dipasang ke ABC (secara default sebagai folder).

Dalam kasus saya, saya memiliki wadah yang dihasilkan dari

docker commit ABC cool_image

Ketika saya kemudian membuat ./file dan menjalankan docker-compose up, saya mengalami kesalahan:

[...] Apakah Anda mencoba memasang direktori ke sebuah file (atau sebaliknya)? Periksa apakah jalur host yang ditentukan ada dan merupakan tipe yang diharapkan.

Kontainer muncul dari cool_imageingat bahwa /dir/fileitu adalah direktori dan itu bertentangan dengan yang baru-baru ini dibuat dan dipasang ./file.

Solusinya adalah:

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image
Yuriy Pozniak
sumber
Terima kasih, ini juga masalah saya karena saya memiliki pengaturan Docker yang cukup rumit!
rmcsharry
1

Di Windows 10, saya hanya mendapatkan kesalahan ini tanpa mengubah apa pun di docker-compose.ymlfile saya atau konfigurasi Docker secara umum.

Dalam kasus saya, saya menggunakan VPN dengan kebijakan firewall yang memblokir port 445.

Setelah memutuskan sambungan dari VPN, masalah tersebut hilang.

Jadi saya sarankan untuk memeriksa firewall Anda dan tidak menggunakan proxy atau VPN saat menjalankan Desktop Docker.

Periksa Docker untuk windows - Aturan firewall untuk drive bersama untuk detail selengkapnya.

Saya harap ini akan membantu orang lain.

Mohammed Réda OUASSINI
sumber
1

Bisakah Anda menggunakan jalur absolut / lengkap daripada $PWD/conf/nginx.conf? Maka itu akan berhasil.

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
sumber
jika Anda menghindarinya dengan tanda kutip ganda: docker run -d --rm -v "$ PWD / nginx.conf: /etc/nginx/nginx.conf" nginx seharusnya tidak ada bedanya karena shell akan menerjemahkannya sebelum meneruskannya untuk buruh pelabuhan dan sebenarnya, itu tidak membuat perbedaan, setidaknya bagi saya
Manumie
1

Saya mengalami masalah yang sama menggunakan Docker melalui WSL1 di Windows 10 dengan baris perintah ini:

echo $PWD
/mnt/d/nginx

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

Saya menyelesaikannya dengan mengubah jalur untuk file di sistem host ke jalur absolut gaya UNIX:

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

atau menggunakan jalur absolut gaya Windows dengan /alih - alih \sebagai pemisah jalur:

docker run --name nginx -d \
  -v D:/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
nginx
bwibo
sumber
Apakah Anda melihat adanya perbedaan kinerja saat menggunakan jalur gaya Windows vs. jalur gaya Unix?
J. Scott Elblein
Saya tidak tahu. Saya hanya menggunakan Docker untuk Windows untuk pengujian / pengembangan dan tidak pernah memantau kinerja.
bwibo
0

Memperbarui Virtual Box ke 6.0.10 memperbaiki masalah ini untuk Docker Toolbox

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

Saya mengalami kesalahan seperti ini:


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

Setelah memperbarui VitualBox semua perintah berfungsi dengan baik 🎉

Mikael Lepistö
sumber
0

Memiliki goresan kepala yang sama karena saya tidak memiliki file secara lokal sehingga membuatnya sebagai 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.dll
sumber
0

tidak diketahui: Apakah Anda mencoba memasang direktori ke file (atau sebaliknya)? Periksa apakah jalur host yang ditentukan ada dan merupakan tipe yang diharapkan

Saya mengalami kesalahan serupa pada niginx di lingkungan Mac. Docker tidak mengenali file default.conf dengan benar. Setelah mengubah jalur relatif ke jalur absolut, kesalahan diperbaiki.

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
simpleDrinker
sumber
0

Bagi saya, ini tidak berhasil:

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

Tapi ini, berfungsi dengan baik (jelas memindahkan file konfigurasi saya ke dalam direktori baru juga:

volumes:
  - ./:/var/www/html
  - ./nginx/nginx.conf:/etc/nginx/conf.d/site.conf
Jon Winstanley
sumber
0

Saya akan membagikan kasus saya di sini karena ini dapat menghemat banyak waktu untuk orang lain di masa mendatang.

Saya memiliki docker-compose yang berfungsi dengan sempurna di macos saya, sampai saya mulai menggunakan buruh pelabuhan-dalam-buruh pelabuhan di Gitlab CI. Saya hanya diberi izin untuk bekerja sebagai Master di repositori, dan Gitlab CI dihosting sendiri dan disiapkan oleh orang lain dan tidak ada info lain yang dibagikan, tentang cara penyiapannya, dll.

Hal berikut menyebabkan masalah:

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

Hanya ketika saya perhatikan bahwa ini mungkin berjalan di bawah windows (berjam-jam menggaruk kepala), saya mencoba mengganti nama wodpress.conf menjadi default.conf dan hanya mengatur nama path dir:

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

Ini memecahkan masalah!

punkbit
sumber
0

Saya mengalami masalah ini di bawah Windows 7 karena dockerfile saya berada di drive yang berbeda.

Inilah yang saya lakukan untuk memperbaiki masalah:

  1. Buka VirtualBox Manager
  2. Pilih penampung "default" dan edit setelannya.
  3. Pilih Folder Bersama dan klik ikon untuk menambahkan folder bersama baru
  4. Jalur Folder: x: \
  5. Nama Folder: / x
  6. Centang Auto-mount dan Make Permanent
  7. Mulai ulang mesin virtual

Pada titik ini, docker-compose upharus bekerja.

pbarney.dll
sumber
0

Saya mendapat kesalahan yang sama di Windows10 setelah pembaruan Docker: 2.3.0.2 (45183).

... disebabkan \\\"not a directory\\\"\"":tidak diketahui: Apakah Anda mencoba memasang direktori ke file (atau sebaliknya)? Periksa apakah jalur host yang ditentukan ada dan merupakan tipe yang diharapkan

Saya menggunakan jalur absolut seperti ini //C/workspace/nginx/nginx.confdan semuanya bekerja seperti pesona.
Pembaruan merusak penulisan buruh pelabuhan saya, dan saya harus mengubah jalur ke /C/workspace/nginx/nginx.confdengan satu /untuk root.

ymoreau
sumber
0

Perhatikan bahwa situasi ini juga akan terjadi jika Anda mencoba memasang volume dari host yang belum ditambahkan ke bagian Sumber Daya> Berbagi File di Preferensi Docker.

masukkan deskripsi gambar di sini

Menambahkan jalur root sebagai sumber daya berbagi file sekarang akan mengizinkan Docker mengakses sumber daya untuk memasangnya ke penampung. Perhatikan bahwa Anda mungkin perlu menghapus konten di kontainer Docker Anda untuk mencoba memasang ulang volume.

Misalnya, jika aplikasi Anda terletak di /mysites/myapp, Anda akan ingin menambahkan /mysitessebagai lokasi sumber daya berbagi file.

Mark Shust di M.academy
sumber
0

Saya memiliki masalah yang sama, docker-compose membuat direktori alih-alih file, lalu mogok di tengah jalan.

Apa yang saya lakukan:

  1. Jalankan wadah tanpa pemetaan apa pun.

  2. Salin .conffile ke lokasi host:

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

  3. Hapus wadah ( docker-compose down).

  4. Kembalikan pemetaan.

  5. Pasang kembali wadah.

Docker Compose akan menemukan .conffile dan memetakannya , alih-alih mencoba membuat direktori .

Chtiwi Malek
sumber
-2

Aku telah memecahkan masalah pemasangan. Saya menggunakan lingkungan Win 7, dan masalah yang sama terjadi pada saya.

Apakah Anda mencoba memasang direktori ke file?

Penampung memiliki direktori sinkronisasi default di C:\Users\, jadi saya memindahkan proyek saya ke C:\Users\, lalu membuat ulang proyek tersebut. Sekarang berhasil.

dan mu
sumber