「Docker Compose」- 生成镜像构建命令

问题描述

在 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