问题描述
在 Docker Compose 中,可以使用 docker-compose build <service> 可以构建单独的镜像。
但是,在实际的应用过程中,还会遇到其他的更复杂的需求,导致我们需要从 docker-compose.yaml 提取构建命令。
该笔记将记录:在 Docker Compose 中,如何使用 docker-compose.yml 生成构建命令。
解决方案
# 04/15/2021 虽然 docker-compose.yaml 支持 build 指令,但是我们很少使用该指令,我们将 docker-compose 作为容器编排的部署工具,而不是构建工具。如果在 docker-compose 中完成构建,那么我们将难以很好的集成到 GitLab CI/CD 中,因此才放弃使用 docker-compose build 方式。
第一步、安装依赖
安装 yq 命令:
apt-get install -y jq pip3 install yq
因为 yq 是对 jq 命令的封装(还有一个 yq 是 Golang 版本),因此需要 jq 命令。
第二步、执行命令
如下命令,可以用于生成 docker build 命令:
docker-compose -f docker-compose-with-build.yml config \ | yq -r '.services | .[] | select(.build != null) | "docker build -f " + .build.context + "/" + .build.dockerfile + " -t " + .image + " " + .build.context'
如下命令,可以用于执行命令(去掉 echo 命令):
docker-compose -f docker-compose-with-build.yml config \ | yq -r '.services | .[] | select(.build != null) | [.build.dockerfile, .image, .build.context] | @tsv' \ | while IFS=$'\t' read -r dockerfile image context do echo docker build -f "${context}/${dockerfile}" -t "${image}" "${context}" done
参考文献
docker-compose build | Docker Documentation