📑

DevContainerでVolumeマウントを使ってビルドを軽くする

2023/02/18に公開

このページは

普段はVSCodeのdevcontainer機能を使って開発をしているのですが、備忘録兼共有として設定ファイルである.devcontainer/devcontainer.jsonと、ちょっとしたテクニック(?)を記載しようと思います。

バージョン情報

VisualStudioCode: 1.75.1
Dev Containers: 0.275.1

devcontainer.json

{
	"name": "Existing Dockerfile",
	"build": {
		"dockerfile": "Dockerfile"
	},
	"mounts": [
        {"type":"volume","source":"devcontainer-sample_venv", "target":"${containerWorkspaceFolder}/.venv"}
	],
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-python.python"
			]
		}
	}
}

ポイントなのはmountsで、ライブラリなどが入るディレクトリ(.venv)をVolumeマウントしている点です。
Devcontainerでは、imageを直接指定したり上記例のようにDockerfileを指定して開発コンテナを作成する場合、デフォルトでは現在開いているワークスペースに対してBindマウントします。

If you add the image or dockerFile properties to devcontainer.json, VS Code will automatically "bind" mount your current workspace folder into the container.

https://code.visualstudio.com/remote/advancedcontainers/change-default-source-mount

しかし、今回のケースやNode.jsプロジェクトにおけるnode_modulesディレクトリのようにプロジェクトディレクトリより下にライブラリを置く構成の場合、Bindの対象となりホストマシン側と同期されてしまうので開発コンテナの初回のビルド時などに重くなってしまいます。
これの対策としてVolume-Trickというものがあり、対象のディレクトリをVolumeマウントする事でBindマウントの対象から除外します。

この部分はそのVolume-Trickを今回のプロジェクトで実現するための設定をしています。

"mounts": [
{"type":"volume","source":"devcontainer-sample_venv","target":"${containerWorkspaceFolder}/.venv"}
],

実際にこのファイルをもとにDevContainer機能を使って開発コンテナをビルドした後、
DockerDesktopを開きVolumesタブを見てみると、ちゃんと名前付きボリュームが作成されている事が確認できます。

参考

https://jdlm.info/articles/2016/03/06/lessons-building-node-app-docker.html
https://matsuand.github.io/docs.docker.jp.onthefly/storage/volumes/
https://matsuand.github.io/docs.docker.jp.onthefly/storage/bind-mounts/

Discussion