docker-compose.ymlのbuild, imageオプション
2022/04/14
docker-compose.yml
のbuild, imageオプションは、それぞれ指定する、しないでdocker立ち上げ時のimage作成の挙動が異なります。
build, imageの挙動を理解してないとlocalのimageレジストリがどんどん膨らんでいく可能性があるので注意が必要です(レジストリはdocker images
で確認できます)。
docker-compose.yml
のbuild, imageオプションに関して簡単に整理してみたので参考になれば幸いです。
build指定なし、image指定あり
imageが指定されている場合は、まずlocalに指定のimageがないかを探しに行きます。 localに指定のimageが見つからなかった場合はremote (DockerHub)からimageをpullします。
docker-compose.yml
version: '3.8'
services:
node:
image: node:16-alpine
restart: always
volumes:
- .:/app
working_dir: /app
command: ['yarn', 'start']
build指定あり、image指定なし
buildで指定されたpathからimageを作成したあと、作成したimageは{project名}_{service名}
としてlocalのプライベートレジストリに登録されます。
docker-compose.yml
version: '3.8'
services:
node:
build: path/to/Dockerfile # <- {project名}_nodeというimageが作成される
restart: always
volumes:
- .:/app
command: ['yarn', 'start']
project名やservice名が変わるごとに新しいimageがどんどん作られていくので、個人的にbuild名だけを指定することはあまりありません。
build指定あり、image指定あり
指定したimageがlocalになかった場合は、buildのpathをもとに新しくimageを作成します。 その後、作成したimageは指定したimage名としてプライベートレジストリに登録されます。
プライベートレジストリに登録された後は、各service間で同じimageを指定することで、自身がbuildしたimageでも以下のように共有して使用することができます。
docker-compose.yml
version: '3.8'
services:
node1:
build: path/to/Dockerfile # <- custom-node imageとしてbuildされる
image: custom-node
restart: always
volumes:
- .:/app
command: ['yarn', 'start']
node2:
image: custom-node # <- buildされたcustom-node imageを使用する
restart: always
volumes:
- .:/app
command: ['yarn', 'start']