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

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

我的问题是在 docker 中使用 git 的最佳实践是什么?

  • 将Dockerfile添加到源代码仓库
  • 为我们所有的 Dockerfiles 创建一个专用的存储库
  • 为每个 Dockerfile
  • 创建了一个专用的存储库
  • 其他?
  • 最佳答案

    将您的 Dockerfile 与源代码一起保存。我们使用标签向生成的图像添加版本信息。我们增加:

  • git 提交和分支
  • 是否“脏”意味着更改是从 git
  • 中的 src 代码本地进行的
  • CI 版本号(公开可见)
  • 构建镜像的人(不是上次 checkin git 的人)

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

    这是我们的一项服务的代码。我们使用 Buildkite 作为我们的 CI 和 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
    

    关于git - Dockerfile 版本控制最佳实践,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39433480/

    10-16 18:37