Bir dizini bir dosyaya mı (veya tam tersi) mi bağlamaya çalışıyorsunuz?


92

Sürümü olan bir liman işçim var 17.06.0-ce. Docker'ı komutla kullanarak NGINX'i kurmaya çalışırken:

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

Gösterir ki

docker: daemon'dan gelen hata yanıtı: oci çalışma zamanı hatası: container_linux.go: 262: kapsayıcı işleminin başlatılması "process_linux.go: 339: kapsayıcı başlatmaya neden oldu \" rootfs_linux.go: 57: montaj \\ "/ appdata / nginx / conf / nginx.conf \\ "to rootfs \\" / var / lib / docker / aufs / mnt / dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0 \\ "\\" at \\ "/ var / lib / docker / aufs / mnt038 / dcea21844 / lib / docker9 \\ "neden \\" bir dizin değil \\ "\" ": Bir dizini bir dosyaya mı (veya tam tersi) mi bağlamaya çalışıyorsunuz? Belirtilen ana bilgisayar yolunun var olup olmadığını ve beklenen tür olup olmadığını kontrol edin.

nginx.confDosyayı bağlamazsanız , her şey yolunda demektir. Peki, yapılandırma dosyasını nasıl bağlayabilirim?


Çıktısı nedir ls -al .? Pwd'nizin neye benzediğini görmek ister misiniz?
Tri Nguyen

1
Benim durumumda, ana bilgisayardaki bir dizini yanlışlıkla konteynerdeki bir dosyaya eşledim. Konteynerin yeniden başlatılması artık işe yaramadı. Konteyneri ( docker rm …) çıkarıp yeniden oluşturmam gerekti.
slhck

Yanıtlar:


26

Çünkü docker bir dosya olarak değil $PWD/conf/nginx.confbir klasör olarak tanıyacaktır . $PWD/conf/Dizinin nginx.confbir dizin olarak içerip içermediğini kontrol edin .

İle test edin

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

Aksi takdirde, bir Docker sorunu açın .
Aynı konfigürasyonla benim için iyi çalışıyor.


Orta düzey bir Linux kullanıcısı olarak merak ediyorum, Linux'un bunu bir dosya olarak değil de klasör olarak tanımasının nedeni nedir?
J. Scott Elblein

Çünkü o aslında bir klasör. Dosya yoksa, docker hacim argümanı nedeniyle bir klasör oluşturur-v
Mathieu Lescaudron

Tamam, bu yüzden Linux bunu yalnızca docker'ın daha önce mevcut olmayan yol nedeniyle oluşturması gerekiyorsa bir klasör olarak tanır; ama eğer nginx.confdaha önce bu yolda zaten varsa, Linux onu bir dosya olarak tanırdı, değil mi?
J. Scott Elblein

137

Bu artık olmamalı (v2.2.0.0'dan beri), buraya bakın


Windows için Docker kullanıyorsanız , parolanızı yakın zamanda değiştirdiyseniz bu hata meydana gelebilir.

Nasıl düzeltilir:

  1. Öncelikle, bozuk kapsayıcı birim Güncellemesini sildiğinizden emin olun
    docker rm -v <container_name>
    : Aşağıdaki adımlar, önce birimleri silmeye gerek kalmadan çalışabilir.
  2. Docker Ayarlarını Aç
  3. "Ortak Sürücüler" sekmesine gidin
  4. Pencerenin altındaki "Kimlik Bilgilerini Sıfırla ..." bağlantısını tıklayın.
  5. Docker ile kullanmak istediğiniz sürücüleri yeniden paylaşın
  • Kullanıcı adınızı / şifrenizi girmeniz istenmelidir
  1. "Uygula" yı tıklayın
  2. "Sıfırla" sekmesine gidin
  3. "Docker'ı Yeniden Başlat" ı tıklayın
  4. Konteynerlerinizi / hacimlerinizi yeniden oluşturun

Çözüm için kredi GitHub'da BaranOrnarli'ye gidiyor.


2
Teşekkürler! İkinci adımdan başlayıp son adımdan kaçınarak benim için çalışıyor.
Mateo Hermosilla

1
2. adımdan başlayarak ve sonuncuyu atlayarak sorunu çözebildim. Tekrar takmak için konteynerleri / birimleri imha etmem gerekmedi.
Christian Engel

@MateoHermosilla'ya katılıyorum, kabı ayırmaya gerek yok, sadece "Kimlik Bilgilerini Sıfırla"
sintetico82

Sandbox-proxy'yi (hadoop) yüklerken proxy-deploy.sh'yi çalıştırmaya çalışırken aynı hatayı alıyorum. Bu çözümü takiben. düzeltmedi.
Vaibhav

2
Bu benim için sorun oldu. Birkaç ayda bir parola sıfırlama yapıldığından, Docker'da Paylaşılan Sürücü kimlik bilgilerini sıfırlamayı unutup duruyorum.
Anders Tornblad

41

TL; DR : Kapla ilişkili hacimleri kaldırın.

Kullanarak kapsayıcı adını bulun ve docker ps -aardından bu kapsayıcıyı şunu kullanarak kaldırın:

docker rm -v <container_name>

Sorun:

Karşılaştığınız hata, daha önce dosya , ana bilgisayar dizininde olması gereken konumda bulunmadığında docker runkomutu çalıştırmayı denediyseniz ortaya çıkabilir .

Bu durumda docker daemon , konteynerin içinde kendi yerine bir dizin yaratırdı , bu daha sonra doğru dosyalar ana bilgisayar dizinine konulduğunda ve docker komutu yeniden çalıştırıldığında uygun dosyaya eşleme yapamaz.

Çözüm:

Kapla ilişkili birimleri kaldırın. Diğer konteyner hacimleriyle ilgili endişeleriniz yoksa şunları da kullanabilirsiniz:

docker volume rm $(docker volume ls -q)

Orijinal sorudaki komut yalnızca kullanılan ana bilgisayar birimlerini listelemiştir. docker volumeKomut / arabirim yalnızca asıl soruya bir parçası olmayan anonim ve ad hacimleri içindir.
programmerq

@programmerq Hataya bakın, benim kesintimde bağlanmaya çalıştığında bağlama işleminin başarısız olduğunu söylüyor /var/lib/docker/aufs/mnt/dcea22444e9ffda114593b18fc8b574adfada06947385aedc2ac09f199188fa0\\\": Bir önceki çalıştırma nedeniyle zaten bir klasör var, bu nedenle bir dosyayı bu klasöre eşlemeye çalışırsanız başarısız olur.
Ayushya

Burada iki şey ters gitmiş olabilir, ya ana bilgisayarda yanlış şeyler var ya da önceden oluşturulmuş birimde yanlış şeyler var. Ana bilgisayarın doğru olduğunu varsayarak, mevcut cilt ile ilgili sorunları gidermenin daha iyi olacağını düşündüm.
Ayushya

1
Bu aslında, kap zaten bir birimle ilişkilendirildiğinde ve bu birimin türü bir sonraki çalıştırmada değiştirildiğinde geçerli bir yanıttır. Bu yüzden sesi çıkarmak yardımcı olabilir!
Yan Fotoğraf

1
Bu yardımcı oldu. Benim durumumdaki sorun aslında hala tanımlanmış eski kaplarımın olmasıydı. Onları zap etmek için docker rm kullanmak ve ardından docker-compose up yapmak düzgün çalıştı.
Max Tardiveau

7

Docker Toolbox kullanan kişiler için cevap

Burada soruna değinen ancak doğru bir şekilde açıklamayan ve tam bir çözüm vermeyen en az 3 cevap var. Bu sadece bir klasör bağlama problemidir .

Problemin tanımı:

Docker Toolbox, bir sanal makine oluşturarak Docker'ın Hyper-V gereksinimini atlar (birlikte gelen VirtualBox'ta). Docker, VM içinde kurulur ve çalıştırılır. Docker'ın düzgün çalışması için ana makineden öğesine erişmesi gerekir. Hangi burada değil.

Docker Toolbox'ı kurduktan sonra, VirtualBox VM'yi oluşturdu ve sadece C:\Usersmakineye \c\Users\. Projem oldu C:\projectsböylece hiçbir yerde hacmini monte üzerinde. Yolu sanal makineye gönderirken mevcut olmayacaktı.C:\projects monte olmayacaktı. Dolayısıyla yukarıdaki hata.

Diyelim ki ngnix yapılandırmamı içeren projem var C:/projects/project_name/

Düzeltiyorum:

  1. VirtualBox'a gidin, Varsayılan'a sağ tıklayın (Docker'dan VM)> Ayarlar> Paylaşılan Klasörler görüntü açıklamasını buraya girin

  2. Sağ tarafta artı işaretli küçük simgeye tıklayarak Yeni paylaşım ekleyin. Aşağıdaki ayarları kullandım:

görüntü açıklamasını buraya girin

  1. Yukarıda eşler C:\projectsiçin /projects( ROOT/projects: şimdi sizin gibi bu projede herhangi bir yol başvurabilir, yani VM) /projects/project_name- çünkü project_namegelen C:\projects\project_nameartık monte edilir.

Göreli yolları kullanmak için lütfen yolu c/projectsdeğilprojects

  1. Her şeyi yeniden başlatın ve şimdi düzgün çalışmalıdır. VirtualBox'ta sanal makineyi manuel olarak durdurdum ve Docker Toolbox CLI'yi yeniden başlattım.

Docker dosyamda, şimdi şu şekilde referans veriyorum nginx.conf:

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

Nginx.conf gerçekte nerede bulunur C:\projects\project_name\docker_config\nginx\nginx.conf


7

@Ayushya tarafından verilen açıklama, bu biraz kafa karıştırıcı hata mesajına çarpmamın sebebiydi ve gerekli temizlik şu şekilde kolayca yapılabilir:

$ docker container prune
$ docker volume prune

6

Ben de aynı sorunu yaşadım. Windows 10 17.09'da WSL ile Docker Desktop kullanıyordum.

Sorunun nedeni:

Sorun, Windows için Docker'ın sizden birim yollarınızı şuna uyan bir biçimde sağlamanızı beklemesidir:

/c/Users/username/app

AMA, WSL bunun yerine şu biçimi kullanır:

/mnt/c/Users/username/app

Bu kafa karıştırıcı çünkü konsoldaki dosyayı kontrol ederken onu gördüm ve benim için her şey doğruydu. Windows için Docker'ın birim yollarıyla ilgili beklentilerinin farkında değildim .

Problemin çözümü:

Windows için Docker ve WSL farklılıklarını düzeltmek için özel bağlama noktalarını bağladım:

sudo mount --bind /mnt/c /c

Bu harika kılavuzda önerildiği gibi: Windows ve WSL için Docker'ı Kusursuz Çalışacak Şekilde Ayarlama ve şimdi her şey mükemmel çalışıyor.

WSL'yi kullanmaya başlamadan önce Git Bash kullanıyordum ve bu problemi de yaşadım.


1
Daha fazla ayrıntı burada: github.com/10up/wp-local-docker/issues/…
nbeuchat

4

Windows için Docker ToolBox kullanıyorum. Varsayılan olarak C Sürücüsü otomatik olarak bağlanır, bu nedenle dosyaları bağlamak için dosyalarınızın ve klasörlerinizin C DRIVE içinde olduğundan emin olun .

Misal: C:\Users\%USERNAME%\Desktop


1
takılı klasörüm C: \ x-suite \; C sürücümü paylaştım , ama yine de sorunumu
çözmedim

Docker ToolBox kullanıyor musunuz?
Abhishek DK

minikube + virtualBox + docker ToolBox, localkube kullanımdan kaldırıldı, hangi sürücüyü kullanmalıyım?
袁文涛

Dockercompose'dan montaj yapıyorsanız $ {pwd} / <path>
Abhishek DK

1
Dockerfile'da yapıyorsanız, VOLUME / c / x-suite
Abhishek DK,

2

Belki birisi bunu yararlı bulur. Oluşturma dosyam aşağıdaki birim bağlandı

./file:/dir/file

./File olmadığı için, ABC'ye (varsayılan olarak klasör olarak) monte edildi.

Benim durumumda bir konteynerim vardı:

docker commit ABC cool_image

Daha sonra ./file oluşturup çalıştırdığımda docker-compose upşu hatayı aldım:

[...] Bir dizini bir dosyaya mı (veya tam tersi) mi bağlamaya çalışıyorsunuz? Belirtilen ana bilgisayar yolunun var olup olmadığını ve beklenen tür olup olmadığını kontrol edin.

Gelen konteyner , bir dizin olduğu ve son zamanlarda oluşturulan ve monte edilen ile çeliştiği cool_imagehatırlandı ./dir/file./file

Çözüm şuydu:

touch ./file
docker run abc_image --name ABC -v ./file:/dir/file
# ... desired changes to ABC
docker commit ABC cool_image

Teşekkürler, oldukça karmaşık bir Docker kurulumum olduğundan bu benim de sorunumdu!
rmcsharry

1

Windows 10'da docker-compose.ymldosyamda veya genel olarak Docker yapılandırmasında hiçbir şeyi değiştirmeden bu hatayı alıyorum .

Benim durumumda, 445 numaralı bağlantı noktasını engelleyen bir güvenlik duvarı politikasına sahip bir VPN kullanıyordum.

VPN bağlantısını kestikten sonra sorun ortadan kalkar.

Bu yüzden Docker Desktop çalıştırırken güvenlik duvarınızı kontrol etmenizi ve bir proxy veya VPN kullanmamanızı tavsiye ederim.

Windows için Docker'ı kontrol edin - Paylaşımlı sürücüler için güvenlik duvarı kuralları fazla ayrıntı için.

Umarım bu başka birine yardımcı olur.


1

Bunun yerine lütfen mutlak / tam yolu kullanabilir misiniz $PWD/conf/nginx.conf? O zaman işe yarayacak.

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

ondan çift tırnak ile kaçarsanız: docker run -d --rm -v "$ PWD / nginx.conf: /etc/nginx/nginx.conf" nginx, kabuk onu geçmeden önce çevireceği için hiçbir fark yaratmamalıdır docker çalıştırmak ve aslında, en azından benim için bir fark
yaratmıyor

1

Bu komut satırıyla Windows 10'da WSL1 üzerinden Docker kullanırken aynı sorunu yaşadım:

echo $PWD
/mnt/d/nginx

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

Bunu, ana bilgisayar sistemindeki dosyanın yolunu UNIX tarzı bir mutlak yola değiştirerek çözdüm:

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

veya yol ayırıcılar /yerine bir Windows stili mutlak yol kullanarak \:

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

Windows stil yolunu kullanırken Unix stil yolunu kullanırken herhangi bir performans farkı fark ettiniz mi?
J. Scott Elblein

Söyleyemem Ben sadece test / geliştirme için Windows için Docker kullanıyorum ve performansı asla izlemedim.
bwibo

0

Virtual Box'ı 6.0.10'a güncellemek, Docker Toolbox için bu sorunu çözdü

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

Bu tür bir hatayla karşılaşıyordum:


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

VitualBox'ı güncelledikten sonra tüm komutlar gayet iyi çalıştı 🎉


0

Aynı kafa çizildi çünkü dosyaya yerel olarak sahip değildim, bu yüzden onu bir klasör olarak oluşturdu.

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/

0

bilinmiyor: Bir dizini bir dosyaya mı (veya tam tersi) mi bağlamaya çalışıyorsunuz? Belirtilen ana bilgisayar yolunun mevcut olup olmadığını ve beklenen tür olup olmadığını kontrol edin

Mac ortamında niginx'te benzer bir hata yaşadım. Docker, default.conf dosyasını doğru şekilde tanımadı. Göreli yolu mutlak yola değiştirdikten sonra, hata düzeltildi.

      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

0

Benim için bu işe yaramadı:

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

Ama bu iyi çalışıyor (açıkçası yapılandırma dosyamı yeni bir dizine taşıdı:

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

0

Gelecekte başka biri için çok zaman kazandırabileceğinden, durumumu burada paylaşacağım.

Gitlab CI'da docker-in-docker kullanmaya başlayana kadar, macOS'umda mükemmel çalışan bir docker-compose'um vardı. Bana yalnızca bir depoda Master olarak çalışma izni verildi ve Gitlab CI kendi kendine barındırılıyor ve başka biri tarafından kuruluyor ve nasıl kurulduğu vb. Hakkında başka hiçbir bilgi paylaşılmadı.

Soruna aşağıdakiler neden oldu:

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

Sadece bunun windows altında çalıştığını fark ettiğimde (saatler kafayı kaşıyarak), wodpress.conf'u default.conf olarak yeniden adlandırmayı denedim ve sadece dir yol adlarını ayarladım:

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

Bu sorunu çözdü!


0

Windows 7 altında bu sorunu yaşadım çünkü dockerfile'ım farklı bir sürücüdeydi.

Sorunu çözmek için yaptığım şey şu:

  1. VirtualBox Manager'ı açın
  2. "Varsayılan" kapsayıcıyı seçin ve ayarları düzenleyin.
  3. Paylaşılan Klasörler'i seçin ve yeni bir paylaşımlı klasör eklemek için simgeye tıklayın
  4. Klasör Yolu: x: \
  5. Klasör Adı: / x
  6. Otomatik Montajı Kontrol Edin ve Kalıcı Yapın
  7. Sanal makineyi yeniden başlatın

Bu noktada docker-compose upçalışmalı.


0

Docker: 2.3.0.2 (45183) güncellemesinden sonra Windows10'da da aynı hatayı aldım.

... \\\"not a directory\\\"\"":bilinmeyen neden oldu : Bir dizini bir dosyaya mı (veya tam tersi) mi bağlamaya çalışıyorsunuz? Belirtilen ana bilgisayar yolunun mevcut olup olmadığını ve beklenen tür olup olmadığını kontrol edin

Bunun gibi mutlak yollar kullanıyordum //C/workspace/nginx/nginx.confve her şey bir cazibe gibi çalıştı.
Güncelleme docker-compose'umu bozdu ve yolları kök için /C/workspace/nginx/nginx.confbir single ile değiştirmek zorunda kaldım /.


0

Bu durumun, Docker Tercihlerinin Kaynaklar> Dosya Paylaşımı bölümüne eklenmemiş ana bilgisayardan bir birimi bağlamayı denediğinizde de ortaya çıkacağını unutmayın.

görüntü açıklamasını buraya girin

Kök yolunu bir dosya paylaşım kaynağı olarak eklemek artık Docker'ın kaynağı kapsayıcıya bağlamak için kaynağa erişmesine izin verecektir. Birimi yeniden takmayı denemek için Docker konteynerinizin içeriğini silmeniz gerekebileceğini unutmayın.

Örneğin, uygulamanız adresinde bulunuyorsa /mysites/myapp, /mysitesdosya paylaşım kaynak konumu olarak eklemek isteyeceksiniz .


0

Ben de aynı sorunu yaşadım, docker-compose dosya yerine bir dizin oluşturuyor, ardından orta yolda çöküyordu.

Ben ne yaptım:

  1. Herhangi bir eşleme yapmadan kabı çalıştırın.

  2. .confDosyayı ana bilgisayar konumuna kopyalayın :

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

  3. Kabı ( docker-compose down) çıkarın .

  4. Eşlemeyi geri koyun.

  5. Konteyneri yeniden monte edin.

Docker Oluştur bulacaksınız .confdosyası ve harita yerine çalışmakla, bunu bir dizin oluşturun .


-2

Montaj sorununu çözdüm. Win 7 ortamı kullanıyorum ve aynı sorun bana da oldu.

Bir dosyaya bir dizin eklemeye mi çalışıyorsunuz?

Konteynerin adresinde varsayılan bir senkronizasyon dizini var C:\Users\, bu yüzden projemi konumuna taşıdım C:\Users\ve sonra projeyi yeniden oluşturdum. Şimdi çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.