【Docker for Mac】コンテナとの共有ディレクトリを設定する方法

今回やりたかったことは、以下のようなMacのローカルにあるpythonのソースコードmain.pyDockerコンテナから参照できるようにして実行するだけ。

$ cat /develop/docker/helloworld/main.py 
print('Hello World!')
$

しかし、デフォルトのディレクトリ配下(/Usersや/tmpなど)以外にあるファイルをコンテナからアクセスするには、Docker for Macの設定で共有ディレクトリを追加する必要があるようです。設定はGUIを操作するだけで簡単でした。

私の環境は以下の通りです。

環境 バージョン
Mac 10.13.2
Docker for Mac 17.09.0-ce-mac35

何も設定しないとこんなエラーが出る

以下のdocker runコマンドは、vオプションでMacの/develop/docker/helloworld/を、コンテナ内の/opt/bin/に共有(マウント)して、そのディレクトリにあるmain.pyをpythonコマンドで実行しようとしています。

起動イメージはpython公式(python:3.6.4-alpine3.7)のものを使用しています。

しかし、vオプションでDocker for Macの共有ディレクトリ設定で許可されていないディレクトリが指定されているため、コンテナの起動に失敗して以下のようなエラーが出力されます。

$ docker run -v /develop/docker/helloworld/:/opt/bin/ python:3.6.4-alpine3.7 python /opt/bin/main.py
docker: Error response from daemon: Mounts denied: 
The path /develop/docker/helloworld/
is not shared from OS X and is not known to Docker.
You can configure shared paths from Docker -> Preferences... -> File Sharing.
See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info.
.
ERRO[0000] error waiting for container: context canceled 
$ 
docker-compose.ymlのvolumesキーで同じように共有ディレクトリを指定した場合も、同様のエラーが発生します。

共有ディレクトリの設定方法

Docker for Macを起動している状態で、メニューバーの[クジラアイコン] > [Preferences…]を押します。

メニューバーからDocker for Macの設定を開く

設定ウィンドウが表示されるので、[File Sharing]タブを選択します。

Docker for Macの[File Sharing]タブ

[+]ボタンを押して、共有ディレクトリに設定したいディレクトリを選択します。

/develop/dockerと設定すると、その配下のディレクトリをvオプションで指定できるようになります。

Docker for Macの設定に共有ディレクトリを追加する

設定を反映させるために、[Apply & Restart]ボタンを押します。

下のメッセージ「Docker starting…」が再度「Docker is runnning」になるまで待機します。

Docker for Macの設定を反映させるために再起動

共有ディレクトリ設定後の結果

設定したディレクトリをコンテナにマウントすることが許可されたため、コンテナ内からmain.pyを実行できるようになりました。

$ docker run -v /develop/docker/helloworld/:/opt/bin/ python:3.6.4-alpine3.7 python /opt/bin/main.py
Hello World!
$

今後、dockerの開発をする際には設定した/develop/docker内で作業することで、追加の設定無しにこのディレクトリ配下にあるディレクトリを、vオプション(もしくはdocker-compose.ymlのvolumesキー)で指定することができるようになります。

まとめ

Docker for Macの共有ディレクトリを設定して、コンテナ内から参照する手順をまとめました。

Dockerを使い始めた当初はファイルを編集してそれを反映させるために、DockerfileのCOPYコマンドでそのファイルをコピーさせたイメージを再ビルドしてからpythonを実行していました。

今回の設定でMacで編集したファイルの変更がコンテナ内でも見えるようになるため、その必要がなくなりました。これで開発が捗ります。