我怎样才能始终提取最新的 docker 图像,但仍确定性地记录其成分以供将来重现?
How can I always pull my latest docker image but still deterministically record its composition for future reproducibility?
我正在我管理的 "Lab" docker 环境中进行分析工作。我使用 Travis 构建、标记实验室映像并将其发布到 docker 容器注册表 (AWS ECR),然后在启动容器进行分析工作时始终拉取 latest
映像。这确保我始终在最新版本的实验室环境中工作。注意:每次 Travis 发布新图像时,它都会在 ECR 中使用构建 git 提交 ID and latest
.
对其进行标记
为了我的分析结果的可重复性,我希望容器内的 python 代码 运行 能够在其输出中记录一个标识符,指示确切的 docker正在使用的图像。这将使我能够重新下载那个特定的 docker 图像许多 months/years 以后从 ECR and/or 找到构建 docker 图像的 git 提交, 运行 再次输入代码,并(希望如此!)得到相同的结果。
实现此目标的最标准方法是什么?我可以将图像摘要存储为容器内的环境变量吗?
将提交 ID 附加到您的图像标签。
例如:imagename:dev-v1-bc4da47
其中 bc4da47 是最后一次提交 ID
您可以通过
获取最后一次提交 ID
git rev-parse --short HEAD
构建图像时,传入带有 git 散列的构建参数:
$ docker build --build-arg GIT_HASH=$(git rev-parse --short HEAD) -t yourimage .
并且在你的 Dockerfile 中你应该有一个:
ARG GIT_HASH
我相信,您现在应该有一个环境变量,其中 git 哈希可用于生成的容器内的代码 运行。
可能有几个选项,但这取决于图像的构建方式
假设源代码在 CI 中被克隆,并且镜像是从那个来源构建的(因此您没有在 Dockerfile 中克隆源代码),您可以使用构建参数 "bake" 在镜像中作为环境变量提交;
在您的 Dockerfile 中,定义一个构建参数 (ARG
),并将其值分配给一个环境变量 (ENV
)。需要将其分配给 ENV
,因为构建参数(按设计)不会保留在图像本身中(仅在构建期间可用)。
例如:
FROM busybox:latest
ARG GIT_COMMIT=HEAD
ENV GIT_COMMIT=${GIT_COMMIT}
我正在设置一个默认值,这样如果 Dockerfile 是在没有传递 build-arg
的情况下构建的,那么变量包含一些东西 "useful"
然后,在构建映像时,将 git 提交作为构建参数传递
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
我正在我管理的 "Lab" docker 环境中进行分析工作。我使用 Travis 构建、标记实验室映像并将其发布到 docker 容器注册表 (AWS ECR),然后在启动容器进行分析工作时始终拉取 latest
映像。这确保我始终在最新版本的实验室环境中工作。注意:每次 Travis 发布新图像时,它都会在 ECR 中使用构建 git 提交 ID and latest
.
为了我的分析结果的可重复性,我希望容器内的 python 代码 运行 能够在其输出中记录一个标识符,指示确切的 docker正在使用的图像。这将使我能够重新下载那个特定的 docker 图像许多 months/years 以后从 ECR and/or 找到构建 docker 图像的 git 提交, 运行 再次输入代码,并(希望如此!)得到相同的结果。
实现此目标的最标准方法是什么?我可以将图像摘要存储为容器内的环境变量吗?
将提交 ID 附加到您的图像标签。
例如:imagename:dev-v1-bc4da47
其中 bc4da47 是最后一次提交 ID
您可以通过
获取最后一次提交 IDgit rev-parse --short HEAD
构建图像时,传入带有 git 散列的构建参数:
$ docker build --build-arg GIT_HASH=$(git rev-parse --short HEAD) -t yourimage .
并且在你的 Dockerfile 中你应该有一个:
ARG GIT_HASH
我相信,您现在应该有一个环境变量,其中 git 哈希可用于生成的容器内的代码 运行。
可能有几个选项,但这取决于图像的构建方式
假设源代码在 CI 中被克隆,并且镜像是从那个来源构建的(因此您没有在 Dockerfile 中克隆源代码),您可以使用构建参数 "bake" 在镜像中作为环境变量提交;
在您的 Dockerfile 中,定义一个构建参数 (ARG
),并将其值分配给一个环境变量 (ENV
)。需要将其分配给 ENV
,因为构建参数(按设计)不会保留在图像本身中(仅在构建期间可用)。
例如:
FROM busybox:latest
ARG GIT_COMMIT=HEAD
ENV GIT_COMMIT=${GIT_COMMIT}
我正在设置一个默认值,这样如果 Dockerfile 是在没有传递 build-arg
的情况下构建的,那么变量包含一些东西 "useful"然后,在构建映像时,将 git 提交作为构建参数传递
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