Docker: Mount ditolak. Paths… tidak dibagikan dari OS X dan tidak dikenal oleh Docker

110

Perintah docker run -v /var/folders/zz/...menghasilkan kesalahan berikut.

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.

Ketika saya membuka File Sharing, saya melihat bahwa / private sudah terdaftar.

Jika saya mencoba untuk menambahkan /var/folder/, itu memutuskan /private/var/folders, yang merupakan bagian dari / pribadi dan karenanya penambahan ditolak.

Untuk meringkas, menurut saya direktori /var/folders/..tersebut dibagikan oleh OS X sebagai subdirektori /privatedan karenanya harus diketahui oleh Docker. Bantuan apa pun untuk menyelesaikan masalah ini akan sangat kami hargai.

Sebagai percobaan, saya mengganti /privatedi File Sharing dengan /private/var/foldersdan memulai kembali buruh pelabuhan tetapi hasilnya tidak berubah.

Untuk referensi yang lebih lengkap, ini adalah skrip .sh , yang menjalankan skrip python ini , yang selanjutnya menjalankan perintah buruh pelabuhan.

Aayush
sumber
3
Apakah kamu sudah mencobanya -v /private/var/folders/zz/...?
Dan Lowe
@DanLowe: Saya belum, karena kodenya seperti WORKING_DIR="$(mktemp -d)dan -v ${WORKING_DIR},. Tetapi meretasnya ke WORKING_DIR="/private"$(mktemp -d), tampaknya menyelesaikan masalah. Terima kasih banyak :)
Aayush
Saya akan memposting jawaban yang menjelaskan mengapa itu berhasil ketika saya mendapatkan beberapa menit
Dan Lowe
Bagus sekali, terima kasih lagi.
Aayush
Saya menemukan pesan kesalahan yang sama. situasi saya tidak berisi ruang apa pun di direktori Anda. Saya mengubah "sisi server" menjadi "sisi server", lalu diselesaikan. semoga bisa membantu seseorang.
andrew54068

Jawaban:

132

Dudukan volume Docker untuk Mac berperilaku berbeda dari sistem Docker dasar. Ini sebagian besar karena Docker mencoba mematuhi pedoman kotak pasir sistem file Apple.

Seperti yang ditunjukkan di preferensi Docker, hanya jalur tertentu yang diekspor oleh macOS.

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

Panel preferensi Berbagi File

/vardi macOS adalah tautan simbolis ke /private. Itu juga berlaku untuk /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

Mengapa /tmpdicantumkan di panel berbagi, tetapi /vartidak (meskipun keduanya adalah bagian dari /private)? Dokumentasi Docker untuk Mac tentang ruang nama sistem file menjelaskan:

Secara default, Anda dapat berbagi file di /Users/, /Volumes/, /private/, dan /tmplangsung. Untuk menambah atau menghapus pohon direktori yang diekspor ke Docker, gunakan tab File sharing di menu paus preferensi Docker -> Preferensi -> Berbagi file. (Lihat Preferensi.)

Semua jalur lain yang digunakan dalam -vbind mount bersumber dari VM Moby Linux yang menjalankan container Docker, jadi argumen seperti itu -v /var/run/docker.sock:/var/run/docker.sockharus berfungsi seperti yang diharapkan. Jika jalur macOS tidak dibagikan dan tidak ada di VM, upaya untuk mengikat pemasangannya akan gagal daripada membuatnya di VM. Jalur yang sudah ada di VM dan berisi file dicadangkan oleh Docker dan tidak dapat diekspor dari macOS.

Perhatikan yang /var/runsecara khusus disebutkan di sini sebagai tempat yang akan dipasang dari VM Linux, bukan dari macOS.

Saat Anda meminta pemasangan volume, ekspor sistem file macOS diperiksa terlebih dahulu. Jika tidak ada kecocokan di sana, VM Linux tempat Docker dijalankan akan diperiksa berikutnya. Jika tidak satu pun dari mereka memiliki jalur yang Anda minta, maka pemasangan gagal.

Dalam kasus Anda, /vartidak diekspor oleh macOS. /varada di VM Linux, tetapi /var/folderstidak. Oleh karena itu, jalur tidak tersedia, dan pemasangan gagal.

Jika Anda mengubah jalur ke /private/var, maka itu akan berhasil, karena macOS mengekspor seluruh /privatepohon sistem file untuk dipasang.

Untuk membuatnya lebih portabel, Anda mungkin ingin menguji platform mana yang saat ini Anda jalankan, dan jika itu macOS, awali jalur pemasangan /private.

Dan Lowe
sumber
4
@ SamuelMéndez Hanya yang pertama. Formatnya adalah mac-path:container-path, dan /privatehanya akan ada di sisi Mac saja.
Dan Lowe
2
Saya menghadapi masalah serupa, siapa pun dapat membantu saya menyelesaikannya ("b'Mounts ditolak: \ r \ nJalan / etc / localtime \ r \ ntidak dibagikan dari OS X dan tidak dikenal oleh Docker. \ R \ nAnda dapat mengonfigurasi jalur bersama dari Docker -> Preferensi ... -> Berbagi File. \ r \ nLihat docs.docker.com/docker-for-mac/osxfs/#namespaces untuk info selengkapnya. \ r \ n. '") mencoba menambahkan / etc melalui Docker -> Preferensi ... -> File Sharing dikatakan / etc disediakan untuk mac os solusi apa saja guys?
Sandish Kumar HN
1
@DanLowe Terima kasih atas tanggapannya. Jika saya mencoba untuk menambahkan / private / etc / localtime melempar "Jalur ekspor / private / etc / localtime tumpang tindih dengan jalur ekspor / private." Saya lelah menambahkan "/ etc / localtime" tetapi mendapat error baru yang mengatakan "APIError: 500 Server Error: Internal Server Error (" kesalahan saat membuat jalur sumber mount '/ etc / localtime': mkdir / etc / localtime: file existing ") " Ada ide??
Sandish Kumar HN
2
Mari kita lanjutkan diskusi ini dalam obrolan .
Sandish Kumar HN
1
@DanLowe Terima kasih atas jawaban baik Anda. Saya memahamimu. Saat kami mengembangkan di Mac OS, terapkan di Ubuntu. Kami menggunakan docker-compose ke volume / etc / localtime. Apakah kita akan memeriksa sistem dan menetapkan jalur yang berbeda? Seperti /private/etc/localtimeuntuk mac os, /etc/localtimeuntuk ubuntu. Bagaimana cara memberi tahu info sistem di Docker-compose.yml? Terima kasih!
hzwzw
4

Sebagai solusi alternatif :

Ubah jalur dari /private/instance1-data:/homemenjadi./instance1-data:/home

Di tanah * nix dan karenanya, Docker, .menunjukkan direktori saat ini. Karena macOS pilih-pilih dan semakin pemilih tentang kotak pasir, ini sepertinya solusi yang layak untuk macOS. Buat saja folder yang diperlukan instance1di direktori yang sama.

Keuntungan lain dari solusi ini adalah menghilangkan kebutuhan untuk menjalankan docker-composedengan sudo. Terlepas dari itu, itu tidak menyebabkan bahaya dalam kasus ini tetapi tetap saja, itu nilai tambah.

Melih
sumber
2

Sebagai contoh, menggunakan Portainer, perintah ini berfungsi untuk saya:

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

Tapi, jika saya memvariasikan -v /var:/datasama sekali, itu tidak akan berhasil. Saya pikir (tetapi tidak yakin) itu karena Docker mencoba melakukan mkdir. Jadi, jika saya mencoba memasang -v /var/whatever:/data, mkdir gagal karena tidak cukup izin, dan tidak berhasil.

Saya memiliki 2 Mac (High Sierra) dan saya mencobanya pada keduanya. Permasalahan yang sama. Juga, saya mencoba menggunakan saluran Docker Beta. Saya rasa saya mengerti jawaban Dan Lowe: Saya akan memperbarui jawaban ini jika itu berhasil untuk saya.

djangofan.dll
sumber
2

Saya memiliki masalah serupa saat saya membuat direktori /var/tmpdi Mac yang ingin saya pasang di kontainer buruh pelabuhan.

Memecahkannya dengan menambahkan jalur direktori ke file sebagai berikut:

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

Sekarang saya bisa melihat direktori /var/tmpdi Docker-> preferensi-> sumber daya-> berbagi file. Lalu saya restart buruh pelabuhan tersebut.

Itu kemudian memecahkan masalah pemasangan saya.

Saum
sumber
0

Masalah saya diperbaiki ketika saya menghapus Path proyek dari File Sharing di preferensi buruh pelabuhan dan restart buruh pelabuhan, Kemudian tambahkan path file proyek lagi.

johnnashautomation
sumber
0

Masalah saya diperbaiki mirip dengan Arghya. Saya hanya perlu menghapus jalur dari file sharing dan restart buruh pelabuhan.

Bruno Rodrigues
sumber