web-dev-qa-db-ja.com

Docker:マウントは拒否されました。パス...はOS Xから共有されておらず、Dockerには知られていません

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コマンドを実行します。

58
Aayush

Mac用Docker ボリュームマウントは、ベースのDockerシステムとは異なる動作をします。これは主に、DockerがAppleのファイルシステムサンドボックスガイドラインに準拠しようとするためです。

Dockerの設定に示されているように、特定のパスのみがmacOSによってエクスポートされます。

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

File Sharing preference panel

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を付けてください。

72
Dan Lowe

例として、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の答えを理解していると思います。それが私のためにうまくいくならば、私はこの答えを更新します。

2
djangofan