0

我正在我管理的“实验室”泊坞窗环境中进行分析工作。我使用 Travis 构建、标记实验室映像并将其发布到 docker 容器注册表 (AWS ECR),然后latest在启动容器进行分析工作时始终拉取映像。这确保我始终在最新版本的实验室环境中工作。注意:每次 Travis 发布一个新图像时,它都会在 ECR 中使用 build git commit ID latest.

为了我的分析结果的可重复性,我希望在容器内运行的 python 代码能够在其输出中记录一个标识符,该标识符指示正在使用的确切 docker 图像。这将使我能够在数月/数年后从 ECR 重新下载特定的 docker 镜像和/或找到构建 docker 镜像的 git 提交,再次运行代码,并且(希望!)得到相同的结果。

实现这一目标的最标准方法是什么?我可以将图像摘要存储为容器内的环境变量吗?

4

3 回答 3

2

可能有几个选项,但这取决于图像的构建方式

假设源代码是​​在 CI 中克隆的,并且从该源构建了映像(因此您没有克隆 Dockerfile 中的源代码),您可以使用 build-arg 将映像中的提交“烘焙”为环境变量;

在您的 Dockerfile 中,定义一个 build-arg ( ARG),并将其值分配给一个环境变量 ( ENV)。需要将其分配给ENV,因为 build-args(按设计)不会保留在映像本身中(仅在构建期间可用)。

例如:

FROM busybox:latest
ARG GIT_COMMIT=HEAD
ENV GIT_COMMIT=${GIT_COMMIT}

我正在设置一个默认值,因此如果 Dockerfile 是在没有传递 build-arg 的情况下构建的,则该变量包含一些“有用”的东西

然后,在构建映像时,将 git commit 作为构建参数传递

git clone https://github.com/me/my-repo.git && cd my-repo

export GIT_COMMIT=$(git rev-parse --short --verify HEAD)

docker build -t lab:${GIT_COMMIT} --build-arg GIT_COMMIT=${GIT_COMMIT} .

运行映像时,GIT_COMMIT可用作环境变量。

如果您想在运行时(运行图像时)传递引用,则可以在运行图像时传递引用;例如,传递您正在运行的图像的摘要;

docker pull lab:latest

export IMAGE_DIGEST=$(docker inspect --format '{{ (index .RepoDigests 0) }}' lab:latest)

docker run -it --rm -e IMAGE_DIGEST=${IMAGE_DIGEST} lab:latest
于 2020-05-01T15:44:19.670 回答
0

将提交 ID 附加到您的图像标签。

例如:图像名称:dev-v1- bc4da47

其中bc4da47是最后一次提交 ID

你可以通过

git rev-parse --short HEAD
于 2020-05-01T15:07:48.287 回答
0

当你构建镜像时,传入一个带有 git 哈希的构建参数:

$ docker build --build-arg GIT_HASH=$(git rev-parse --short HEAD) -t yourimage .

在你的 Dockerfile 中你应该有一个:

ARG GIT_HASH

我相信,您现在应该拥有一个环境变量,其中包含可用于在生成的容器内运行的代码的 git 哈希。

长版:https ://pythonspeed.com/articles/identifying-images/

于 2020-05-01T15:43:01.343 回答