今回やりたかったことは、以下のようなMacのローカルにあるpythonのソースコードmain.py
をDockerコンテナから参照できるようにして実行するだけ。
$ 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
$
volumes
キーで同じように共有ディレクトリを指定した場合も、同様のエラーが発生します。共有ディレクトリの設定方法
Docker for Macを起動している状態で、メニューバーの[クジラアイコン] > [Preferences…]を押します。
設定ウィンドウが表示されるので、[File Sharing]タブを選択します。
[+]ボタンを押して、共有ディレクトリに設定したいディレクトリを選択します。
/develop/docker
と設定すると、その配下のディレクトリをvオプションで指定できるようになります。
設定を反映させるために、[Apply & Restart]ボタンを押します。
下のメッセージ「Docker starting…」が再度「Docker is runnning」になるまで待機します。
共有ディレクトリ設定後の結果
設定したディレクトリをコンテナにマウントすることが許可されたため、コンテナ内から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で編集したファイルの変更がコンテナ内でも見えるようになるため、その必要がなくなりました。これで開発が捗ります。