Dockerfile 版本控制最佳实践
Dockerfile versioning best practice
我们是一些正在开发 C++ 应用程序的开发人员。
为了确保每个人都使用与远程生产服务器相同的库和依赖项,我们使用 docker 在本地主机中编译代码源。
我的问题是将 git 与 docker 结合使用的最佳做法是什么?
- 将 Dockerfile 添加到源代码存储库
- 为我们所有的 Dockerfiles 创建一个专用存储库
- 为每个 Dockerfile 创建了一个专用存储库
- 其他?
将您的 Dockerfile 与源代码一起保存。我们使用标签将版本控制信息添加到生成的图像中。我们添加:
- git 提交和分支
- 是否是 "dirty" 意味着根据 git
中的内容在 src 代码上本地进行了更改
- 一个CI版本号(公开可见)
- 构建镜像的人(不是最后签到的人git)
我们还用提交编号标记图像。
这是我们的一项服务的代码。我们正在使用 Buildkite for our CI and Quay.io 作为我们的图像注册表。
build-image.sh
echo '===> Building docker image...'
GIT_BRANCH=$(git name-rev --name-only HEAD | sed "s/~.*//")
GIT_COMMIT=$(git rev-parse HEAD)
GIT_COMMIT_SHORT=$(echo $GIT_COMMIT | head -c 8)
GIT_DIRTY='false'
BUILD_CREATOR=$(git config user.email)
BUILD_NUMBER="${BUILDKITE_BUILD_NUMBER-0}"
# Whether the repo has uncommitted changes
if [[ $(git status -s) ]]; then
GIT_DIRTY='true'
fi
docker build \
-q \
-t quay.io/myco/servicename:latest \
-t quay.io/myco/servicename:"$GIT_COMMIT_SHORT" \
--build-arg GIT_BRANCH="$GIT_BRANCH" \
--build-arg GIT_COMMIT="$GIT_COMMIT" \
--build-arg GIT_DIRTY="$GIT_DIRTY" \
--build-arg BUILD_CREATOR="$BUILD_CREATOR" \
--build-arg BUILD_NUMBER="$BUILD_NUMBER" \
.
echo "Done"
echo "Push to quay using:"
echo " docker push quay.io/myco/servicename:latest"
echo " docker push quay.io/myco/servicename:$GIT_COMMIT_SHORT"
Dockerfile
FROM ...
ARG GIT_COMMIT
ARG GIT_BRANCH=master
ARG GIT_DIRTY=undefined
ARG BUILD_CREATOR
ARG BUILD_NUMBER
LABEL branch=$GIT_BRANCH \
commit=$GIT_COMMIT \
dirty=$GIT_DIRTY \
build-creator=$BUILD_CREATOR \
build-number=$BUILD_NUMBER
... etc
然后你可以制作脚本来检查你的图像版本。例如:
docker inspect --format "{{.ContainerConfig.Labels.commit}}" imageid
我会选择 2 或 3。
我不会将 Docker 文件与源一起保留,因为每个源的目的不同:
- Docker 和 Dockerfile 通常属于 devops 世界,并且独立于实际软件运行。例如Docker 是部署软件的一种方式,但不是唯一的方式。
- 您的 Docker 文件将来可能会从另一个 git 存储库中聚合软件 - 您会将其保存在哪个存储库中?
- 软件中的更改不应系统地影响Docker文件回购分支
的版本
- dockerfile 中的更改不应影响软件 repo 分支的版本
有时我可以理解 Docker 文件与软件源的耦合如此紧密,实际上您只是为了简单起见而想将它们全部存储在一起。但我不会以任何方式将其作为标准。
我们是一些正在开发 C++ 应用程序的开发人员。
为了确保每个人都使用与远程生产服务器相同的库和依赖项,我们使用 docker 在本地主机中编译代码源。
我的问题是将 git 与 docker 结合使用的最佳做法是什么?
- 将 Dockerfile 添加到源代码存储库
- 为我们所有的 Dockerfiles 创建一个专用存储库
- 为每个 Dockerfile 创建了一个专用存储库
- 其他?
将您的 Dockerfile 与源代码一起保存。我们使用标签将版本控制信息添加到生成的图像中。我们添加:
- git 提交和分支
- 是否是 "dirty" 意味着根据 git 中的内容在 src 代码上本地进行了更改
- 一个CI版本号(公开可见)
- 构建镜像的人(不是最后签到的人git)
我们还用提交编号标记图像。
这是我们的一项服务的代码。我们正在使用 Buildkite for our CI and Quay.io 作为我们的图像注册表。
build-image.sh
echo '===> Building docker image...'
GIT_BRANCH=$(git name-rev --name-only HEAD | sed "s/~.*//")
GIT_COMMIT=$(git rev-parse HEAD)
GIT_COMMIT_SHORT=$(echo $GIT_COMMIT | head -c 8)
GIT_DIRTY='false'
BUILD_CREATOR=$(git config user.email)
BUILD_NUMBER="${BUILDKITE_BUILD_NUMBER-0}"
# Whether the repo has uncommitted changes
if [[ $(git status -s) ]]; then
GIT_DIRTY='true'
fi
docker build \
-q \
-t quay.io/myco/servicename:latest \
-t quay.io/myco/servicename:"$GIT_COMMIT_SHORT" \
--build-arg GIT_BRANCH="$GIT_BRANCH" \
--build-arg GIT_COMMIT="$GIT_COMMIT" \
--build-arg GIT_DIRTY="$GIT_DIRTY" \
--build-arg BUILD_CREATOR="$BUILD_CREATOR" \
--build-arg BUILD_NUMBER="$BUILD_NUMBER" \
.
echo "Done"
echo "Push to quay using:"
echo " docker push quay.io/myco/servicename:latest"
echo " docker push quay.io/myco/servicename:$GIT_COMMIT_SHORT"
Dockerfile
FROM ...
ARG GIT_COMMIT
ARG GIT_BRANCH=master
ARG GIT_DIRTY=undefined
ARG BUILD_CREATOR
ARG BUILD_NUMBER
LABEL branch=$GIT_BRANCH \
commit=$GIT_COMMIT \
dirty=$GIT_DIRTY \
build-creator=$BUILD_CREATOR \
build-number=$BUILD_NUMBER
... etc
然后你可以制作脚本来检查你的图像版本。例如:
docker inspect --format "{{.ContainerConfig.Labels.commit}}" imageid
我会选择 2 或 3。
我不会将 Docker 文件与源一起保留,因为每个源的目的不同:
- Docker 和 Dockerfile 通常属于 devops 世界,并且独立于实际软件运行。例如Docker 是部署软件的一种方式,但不是唯一的方式。
- 您的 Docker 文件将来可能会从另一个 git 存储库中聚合软件 - 您会将其保存在哪个存储库中?
- 软件中的更改不应系统地影响Docker文件回购分支 的版本
- dockerfile 中的更改不应影响软件 repo 分支的版本
有时我可以理解 Docker 文件与软件源的耦合如此紧密,实际上您只是为了简单起见而想将它们全部存储在一起。但我不会以任何方式将其作为标准。