Docker: Bağlantılar reddedildi. Yollar… OS X'ten paylaşılmaz ve Docker tarafından bilinmez


112

Komut docker run -v /var/folders/zz/...aşağıdaki hatayı üretir.

docker: Error response from daemon: Mounts denied: 
The paths /var/folders/zz/... and /var/folders/zz/...
are not shared from OS X and are not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.

Dosya Paylaşımı'nı açtığımda, / özel'in zaten listelendiğini görüyorum.

Eklemeye çalışırsam , / özel'in bir alt kümesi olan /var/folder/çözülür /private/var/foldersve dolayısıyla ekleme reddedilir.

Özetlemek gerekirse, bana, dizin /var/folders/..OS X tarafından bir alt dizini olarak paylaşılıyor /privateve bu nedenle Docker tarafından bilinmesi gerekiyor gibi görünüyor. Bunu çözmek için herhangi bir yardım memnuniyetle karşılanacaktır.

Bir deney olarak, /privateDosya Paylaşımını değiştirdim /private/var/foldersve docker'ı yeniden başlattım ancak sonuç değişmedi.

Sadece daha kapsamlı başvuru için, bu .sh komut çalıştırır, bu python komut sırayla liman işçisi komutu çalıştırır.


3
Denedin -v /private/var/folders/zz/...mi
Dan Lowe

@DanLowe: Yapmadım, çünkü kod WORKING_DIR="$(mktemp -d)ve gibi gitti -v ${WORKING_DIR}. Ancak bunu hacklemek WORKING_DIR="/private"$(mktemp -d)sorunu çözüyor gibi görünüyor. Çok teşekkür ederim :)
Aayush

Bunun birkaç dakika olsun çalıştı nedenini açıklayan bir cevap göndeririz
Dan Lowe

Bu harika olur, tekrar teşekkürler.
Aayush

Aynı hata mesajıyla karşılaşıyorum. benim durumum dizininizde boşluk içermemesi "sunucu tarafı" nı "serverSide" olarak değiştirdim sonra çözüldü. umarım birine yardım edebilir.
andrew54068

Yanıtlar:


136

Mac için Docker birim bağlantıları, temel Docker sisteminden farklı davranır. Bunun nedeni Docker'ın Apple'ın dosya sistemi sanal alan yönergelerine uymaya çalışmasıdır.

Docker tercihlerinde gösterildiği gibi, macOS tarafından yalnızca belirli yollar dışa aktarılır.

  • /Users
  • /Volumes
  • /tmp
  • /private

Dosya Paylaşımı tercih paneli

/varmacOS'ta /private. Bu aynı zamanda şunlar için de geçerlidir /tmp:

$ ls -ld /tmp /var
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /tmp -> private/tmp
lrwxr-xr-x@ 1 root  wheel  11 Jan 26 16:18 /var -> private/var

Neden /tmppaylaşım panelinde listeleniyor ancak listelenmiyor /var(her ikisi de bir parçası olmasına rağmen /private)? Mac için Docker'ın dosya sistemi ad alanlarıyla ilgili belgeleri şunları açıklar:

Varsayılan olarak, dosya paylaşmak /Users/, /Volumes/, /private/, ve /tmpdoğrudan. Docker'a dışa aktarılan dizin ağaçlarını eklemek veya kaldırmak için Docker tercihleri ​​balina menüsü -> Tercihler -> Dosya paylaşımı içindeki Dosya paylaşımı sekmesini kullanın. (Bkz. Tercihler.)

-vBağlama bağlamalarında kullanılan diğer tüm yollar , Docker konteynerlerini çalıştıran Moby Linux VM'den kaynaklanır, bu nedenle gibi argümanlar -v /var/run/docker.sock:/var/run/docker.sockbeklendiği gibi çalışmalıdır. Bir macOS yolu paylaşılmıyorsa ve sanal makinede yoksa, onu sanal makinede oluşturmak yerine onu bağlama girişimi başarısız olacaktır. Sanal makinede zaten var olan ve dosyalar içeren yollar Docker tarafından ayrılır ve macOS'tan dışa aktarılamaz.

/var/runBurada özellikle macOS yerine Linux VM'den monte edilecek bir yer olarak bahsedildiğini unutmayın .

Bir birim bağlama istediğinizde, önce macOS dosya sistemi dışa aktarımları kontrol edilir. Orada eşleşme yoksa, Docker'ın çalıştığı Linux VM daha sonra kontrol edilir. Hiçbiri istediğiniz yola sahip değilse, bağlantı başarısız olur.

Sizin durumunuzda, /varmacOS tarafından dışa aktarılmaz. /varLinux sanal makinesinde vardır, ancak /var/foldersyoktur. Bu nedenle, yol mevcut değildir ve montaj başarısız olur.

Yolu olarak değiştirirseniz /private/varbaşarılı olur çünkü macOS tüm /privatedosya sistemi ağacını montaj için dışa aktarır .

İşleri daha taşınabilir hale getirmek için, şu anda hangi platformda çalıştığınızı test etmek isteyebilirsiniz ve macOS ise bağlama yolunun önüne koyabilirsiniz /private.


4
@ SamuelMéndez Sadece ilki. Biçim mac-path:container-path, ve /privateyalnızca Mac tarafında var olacaktır.
Dan Lowe

2
Benzer bir sorunla karşılaştığımda herkes çözmeme yardımcı olabilir mi ("b'Mounts reddedildi: \ r \ n / etc / localtime \ r \ nis yolu OS X'ten paylaşılmıyor ve Docker tarafından bilinmiyor. \ R \ nPaylaşılan yolları yapılandırabilirsiniz Docker'dan -> Tercihler ... -> Dosya Paylaşımı. \ r \ nDaha fazla bilgi için docs.docker.com/docker-for-mac/osxfs/#namespaces'a bakın . \ r \ n. '") / etc eklemeyi denedi Docker -> Tercihler ... -> Dosya Paylaşımı diyor ki / etc herhangi bir çözüm için mac os için ayrılmıştır?
Sandish Kumar HN

1
@DanLowe Cevabınız için teşekkürler. / Private / etc / localtime eklemeye çalışırsam, "/ private / etc / localtime verme yolu / özel verme yolu ile çakışıyor." "/ Etc / localtime" eklemekten yoruldum ama "APIError: 500 Sunucu Hatası: Dahili Sunucu Hatası (" bağlama kaynak yolunu oluştururken hata '/ etc / localtime': mkdir / etc / localtime: dosya var ") diyor yeni bir hata aldım " Herhangi bir fikir??
Sandish Kumar HN


1
@DanLowe Nazik cevabınız için teşekkür ederiz. Seni anlıyorum. Mac OS üzerinde geliştirdiğimizde, Ubuntu'da konuşlandırın. Docker-compose'u volume / etc / localtime için kullanıyoruz. Sistemi kontrol edip farklı bir yol mu belirleyeceğiz? Gibi /private/etc/localtimemac os, için /etc/localtimeubuntu için. Docker-compose.yml'deki sistem bilgisi nasıl söylenir? Teşekkür ederim!
hzwzw

6

Bir de , alternatif bir çözüm:

Yolu olarak /private/instance1-data:/homedeğiştir./instance1-data:/home

* Nix alanında ve dolayısıyla Docker, .geçerli dizini gösterir. MacOS, sandbox oluşturma konusunda seçici ve titiz olduğu için, bu macOS için uygun bir çözüm gibi görünüyor. Sadece instance1aynı dizinde gerekli olan klasörü oluşturun .

Bu çözümün diğer bir avantajı da çalıştırmak için ihtiyacını ortadan kaldırır olmasıdır docker-composeile sudo. Ne olursa olsun, bu durumda hiçbir zararı yoktur ama yine de bu bir artıdır.


3

/var/tmpMac'imde docker konteynerime monte etmek istediğim bir dizin oluşturduğumda benzer bir sorun yaşadım .

Aşağıdaki gibi bir dosyaya dizin yolunu ekleyerek çözüldü:

$ cat ~/Library/Group\ Containers/group.com.docker/settings.json  
{
  "filesharingDirectories" : [
    "\/Users",
    "\/Volumes",
    "\/private",
    "\/tmp",
    "\/var\/tmp"
  ],
…

Artık dizini /var/tmpDocker-> tercih-> kaynaklar-> dosya paylaşımında görebiliyordum. Sonra docker'ı yeniden başlattım.

Daha sonra montaj sorunumu çözdü.


2

Örnek olarak, Portainer kullanıldığında, bu komut benim için çalışıyor:

docker run -d --restart unless-stopped -p 9000:9000 \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v /var:/data portainer/portainer --no-auth

Ama ben değiştirirsem, -v /var:/dataişe yaramayacak. Sanırım (ama emin değilim) Docker bir mkdir yapmaya çalışıyor çünkü. Yani, eğer mount etmeye çalışırsam -v /var/whatever:/data, mkdir yeterli izin olmadığı için başarısız oluyor ve çalışmıyor.

2 Mac'im var (High Sierra) ve her ikisinde de denedim. Aynı sorun. Ayrıca Docker Beta kanalını kullanmayı denedim. Sanırım Dan Lowe'nin cevabını anlıyorum: Eğer benim için uygunsa bu cevabı güncelleyeceğim.


0

Docker tercihlerinde proje Yolunu Dosya Paylaşımından kaldırdığımda ve docker'ı yeniden başlattığımda sorunum çözüldü, ardından proje dosyası yolunu tekrar ekleyin.


0

Sorunum Arghya'nınkine benzer şekilde düzeltildi. Sadece dosya paylaşımından yolları kaldırmam ve docker'ı yeniden başlatmam gerekiyordu.


-1

Netcoreapp için / usr / local / share / paylaştığınızdan emin olun

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.