ha6_6ruブログ

主にフロントエンドの技術ネタを中心にしていく予定です。

Docker Comose バインドマウントと相対パスの名前付きボリューム

概要

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、積極的に使っていこう。