cloud buildでの docker runコマンドの volume指定について
Google Cloud Buildeはビルドスクリプトを容易に記述できて便利なのですが、docker runコマンドで volumeをマウントしようとすると大変です。
理由は、Cloud Build自体がコンテナで実行されており、その中からビルドステップをコンテナで実行しているため docker runコマンドで指定するホスト側のパスは Cloud Buildのホストのパスを指定する必要があるためです。
dockerを起動させたホスト側のパスは、以下のように docker volume inspectコマンドで確認することが可能です。
$ docker volume ls -q --filter name=homevol|cloudbuild_ | xargs docker volume inspect
[
{
"CreatedAt": "2018-09-22T04:56:00Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/cloudbuild_vol_25da440e-a131-497c-8da5-a8ee5d20f565/_data",
"Name": "cloudbuild_vol_25da440e-a131-497c-8da5-a8ee5d20f565",
"Options": {},
"Scope": "local"
},
{
"CreatedAt": "2018-09-22T04:55:59Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/homevol/_data",
"Name": "homevol",
"Options": null,
"Scope": "local"
}
]
cloud buildでは、ホームディレクトリの volumeに対して homevol という名前を割り当てています。
// homeVolume is the name of the Docker volume that contains the build's
// $HOME directory, mounted in as /builder/home.
homeVolume = "homevol"
homeDir = "/builder/home"
例えば、cloud buildのビルドステップのコンテナでのホームディレクトリ /builder/home に対応するホスト側のパスは以下のように取得できます。
$ docker volume inspect --format '{{ .Mountpoint }}' homevol
/var/lib/docker/volumes/homevol/_data
以下の cloud builのスクリプト cloudbuild.yaml は1つ目のステップでホームディレクトリに testファイルを作成し、2つ目のステップでホームディレクトリを /mntにマウントして docker runを実行し、1つ目のステップで作成したファイルを表示するものです。
steps:
- id: create-test-file
name: ubuntu
entrypoint: bash
args:
- -c
- |
cat << EOF > /builder/home/test
hello
world
EOF
- id: cat-test-file-in-docker
name: gcr.io/cloud-builders/docker
entrypoint: bash
args:
- -c
- |
docker run -v $(docker volume inspect --format '{{ .Mountpoint }}' homevol):/mnt ubuntu cat /mnt/test
Docker in Dockerの環境において、--volume オプションで volumeをマウントする場合も、同じ方法で対応可能です。