概要
Dockerボリュームのバインドマウントとdriver optionの相対パス指定について記載します。
Visual Studio Code Dev Containersを使って開発環境を作る時に個人的に必要になった情報をまとめています。
バインドマウント
バインドマウントはDockerコンテナ内で扱うファイルをホスト側に保存する仕組みで、Dockerコンテナ内で扱うファイルをホスト側に保存する仕組みは他にボリュームがあります。
バインド マウント(bind mount) の使用 — Docker-docs-ja 20.10 ドキュメント
バインドマウントはホスト側のファイルをコンテナにマウントし、マウントしているファイルがホスト側の管理になるのが特徴です。
ソースコードをホスト側で編集して、コンテナ側でそのソースコードをビルドして実行、という形に都合が良かったりします。
バインドマウントの定義例
services: app: volumes: - type: bind source: ./app/volume # ホスト側の docker-compose.yml からの相対パス target: /workspaces/app # コンテナ側の絶対パス
この場合は識別子を付けて管理することはできず、docker volume ls
を実行すると、
可読性の無いIDが表示されることになります。
driver optionの相対パス
driver optionを使用すると、識別子に任意の名前を付け、かつバインドマウントにすることができます。
driver optionを使った定義例
services: app: volumes: - app-volume-id:/workspaces/app volumes: app-volume-id: driver: local driver_opts: type: none o: bind device: '${PWD}/app/volume'
ここで相対パスを指定したい場合、カレントディレクトリを表す${PWD}
を使います。
Compose does not mount volume if I use relative path · Issue #9191 · docker/compose · GitHub
Dev Containers
Dev Containersで環境を作っている場合、次のバインドマウントの定義によってホスト側に配置したソースコードをマウントした後、VS Code Serverを通してソースコードにアクセスすることができるようになります。
services: app: volumes: - type: bind source: ./app/volume # ホスト側の docker-compose.yml からの相対パス target: /workspaces/app # コンテナ側の絶対パス
さらに、Dev Containersに固有のボリューム構造があり、自動的に識別子が付与され、docker volume ls
を実行した時に可読性の無いIDが表示されることもありません。
Developing inside a Container using Visual Studio Code Remote Development
Dev Containers、積極的に使っていこう。