docker run -v /var/folders/zz/...
コマンドは次のエラーを生成します。
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.
ファイル共有を開くと、/ privateが既にリストされているのがわかります。
/var/folder/
を追加しようとすると、それは/ privateのサブセットである/private/var/folders
に解決されるため、追加は拒否されます。
まとめると、ディレクトリ/var/folders/..
は/private
のサブディレクトリとしてOS Xによって共有されているので、Dockerに認識されている必要があります。これを解決する上で任意の助けがいただければ幸いです。
実験として、ファイル共有の/private
を/private/var/folders
に置き換えてdockerを再起動しましたが、結果は変わりませんでした。
より完全な参照のために、これは 。shスクリプト 、これは このpythonスクリプト を実行し、次にdockerコマンドを実行します。
Mac用Docker ボリュームマウントは、ベースのDockerシステムとは異なる動作をします。これは主に、DockerがAppleのファイルシステムサンドボックスガイドラインに準拠しようとするためです。
Dockerの設定に示されているように、特定のパスのみがmacOSによってエクスポートされます。
/Users
/Volumes
/tmp
/private
macOSの/var
は、/private
へのシンボリックリンクです。 /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
なぜ/tmp
が共有パネルにリストされているのに、/var
がリストされていないのですか(両方が/private
の一部であっても)? Docker for Macの ファイルシステムの名前空間に関するドキュメント の説明:
デフォルトでは、
/Users/
、/Volumes/
、/private/
、および/tmp
のファイルを直接共有できます。 Dockerにエクスポートされるディレクトリツリーを追加または削除するには、Docker設定の[鯨]メニュー-> [設定]-> [ファイル共有]の[ファイル共有]タブを使用します。 (設定を参照してください。)
-v
バインドマウントで使用される他のすべてのパスは、Dockerコンテナーを実行するMoby Linux VMから供給されます。so arguments-v /var/run/docker.sock:/var/run/docker.sock
などは期待どおりに動作するはずです。 macOSパスが共有されておらず、VMに存在しない場合、VMで作成するのではなく、マウントをバインドしようとすると失敗します。 VMに既に存在し、ファイルを含むパスはDockerによって予約されており、macOSからエクスポートできません。
/var/run
は、macOSではなくLinux VMからマウントされる場所としてここで特に言及されていることに注意してください。
ボリュームのマウントを要求すると、macOSファイルシステムのエクスポートが最初にチェックされます。一致するものがない場合、Dockerが実行されているLinux VMが次にチェックされます。どちらにも要求したパスがない場合、マウントは失敗します。
あなたの場合、/var
はmacOSによってエクスポートされません。 /var
はLinux VMに存在しますが、/var/folders
は存在しません。したがって、パスは使用できず、マウントは失敗します。
パスを/private/var
に変更すると、macOSは/private
ファイルシステムツリー全体をマウント用にエクスポートするため、成功します。
移植性を高めるために、現在実行しているプラットフォームをテストし、macOSの場合は、マウントパスの前に/private
を付けてください。
例として、Portainerを使用して、このコマンドは私のために働きます:
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
しかし、私が-v /var:/data
を少しでも変えても、うまくいきません。 Dockerがmkdirを実行しようとしているからです。だから、私が-v /var/whatever:/data
をマウントしようとすると、mkdirは十分な許可がないので失敗し、それは機能しません。
私は2台のMac(High Sierra)を持っていて、両方で試した。同じ問題です。また、Docker Betaチャンネルを使ってみました。私はDan Loweの答えを理解していると思います。それが私のためにうまくいくならば、私はこの答えを更新します。