Dockerfile版本控制最佳实践

时间:2016-09-11 06:35:11

标签: git docker devops

我们是一些正在开发C ++应用程序的开发人员。

为了确保每个人都使用与远程生产服务器相同的库和依赖项,我们使用docker在我们的localhost中编译代码源。

我的问题是使用git和docker的最佳做法是什么?

  1. 将Dockerfile添加到源代码存储库
  2. 为我们所有的Dockerfiles创建专用存储库
  3. 为每个Dockerfile创建一个专用存储库
  4. 其他?

2 个答案:

答案 0 :(得分:13)

使用源代码保存Dockerfile。我们使用标签将版本信息添加到生成的图像中。我们补充说:

  • git commit and branch
  • 是否“脏”意味着在src代码上本地更改来自git中的内容
  • CI版本号(公开可见)
  • 构建图像的人(不是最后一次检入git的人)

我们还使用提交编号标记图像。

这是我们的一项服务的代码。我们的CI使用Buildkite,图像注册表使用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

答案 1 :(得分:2)

我要去2或3.

我不会将Dockerfile与源保持一致,因为每个源的目的都不同:

  • Docker和Dockerfile通常属于devops世界,并且独立于实际软件。例如Docker是部署软件的一种方式,但它并不是唯一的方式。
  • 您的Dockerfile将来可能会从另一个git存储库聚合软件 - 您将在哪个存储库中保留它?
  • 软件的更改不应系统地影响Dockerfile repo分支的版本
  • dockerfile中的更改不应影响Software repo分支的版本

有时我可以理解Dockerfile与软件源紧密耦合,实际上你只是想将它们全部存储在一起以简化。但我不会以任何方式将其作为标准。