【发布时间】:2022-12-06 18:00:41
【问题描述】:
我正在使用 Github Actions 进行持续交付并为我的应用程序构建 Docker 映像。
如何在我的 Docker 镜像中添加版本信息
- 发布标签
- 提交散列
- 提交消息
【问题讨论】:
标签: docker github-actions
我正在使用 Github Actions 进行持续交付并为我的应用程序构建 Docker 映像。
如何在我的 Docker 镜像中添加版本信息
【问题讨论】:
标签: docker github-actions
您可以通过几个步骤的组合来做到这一点
动作 YAML
# https://*.com/a/58178121/315168
- name: Scrape build info
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Build and push
uses: docker/build-push-action@v3
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
# https://*.com/questions/67051284/how-to-set-a-dockerfile-arg-in-github-actions
# https://*.com/a/63619526/315168
build-args: |
GIT_VERSION_TAG=${{ env.RELEASE_VERSION }}
GIT_COMMIT_MESSAGE=${{ github.event.head_commit.message }}
GIT_VERSION_HASH=${{ github.sha }}
然后在Dockerfile:
# Passed from Github Actions
ARG GIT_VERSION_TAG=unspecified
ARG GIT_COMMIT_MESSAGE=unspecified
ARG GIT_VERSION_HASH=unspecified
WORKDIR /usr/src/myapp
# You can read these files for the information in your application
RUN echo $GIT_VERSION_TAG > GIT_VERSION_TAG.txt
RUN echo $GIT_COMMIT_MESSAGE > GIT_COMMIT_MESSAGE.txt
RUN echo $GIT_VERSION_HASH > GIT_VERSION_HASH.txt
【讨论】:
要在 Github Actions 构建期间将 Git 标签和版本信息添加到 Docker 映像,您可以在构建脚本中使用 git 命令获取当前 Git 标签和提交哈希,然后使用 DOCKER_BUILDKIT 功能将此信息作为Docker 镜像中的标签。
这是如何完成此操作的示例:
GIT_TAG=$(git describe --tags --always)
GIT_HASH=$(git rev-parse HEAD)
DOCKER_BUILDKIT=1 docker build
--label "com.example.git-tag=$GIT_TAG"
--label "com.example.git-hash=$GIT_HASH"
-t my-image:latest .
git describe 命令将输出当前提交可访问的最新 Git 标记,后跟自该标记以来的提交数和缩写的提交哈希。然后可以使用 --label 标志将此信息作为标签包含在 Docker 映像中。
您还可以使用 DOCKER_BUILDKIT 功能来启用 buildkit,它为构建 Docker 映像提供改进的性能和附加功能。
Docker镜像构建完成后,可以使用docker inspect命令查看镜像中添加的标签,验证是否包含Git tag和commit hash。
$ docker inspect my-image:latest
[
...
"Labels": {
"com.example.git-tag": "v1.0.0",
"com.example.git-hash": "7b5ebc3c3dd3e2f3f6f3d3c3e3f3d3c3e3f3d3c3"
}
]
这只是您如何在 Github Actions 构建期间将 Git 标记和版本信息添加到 Docker 映像的一个示例。还有许多其他方法可以实现这一点,具体步骤将取决于您的具体用例以及您使用的工具和技术。
【讨论】: