Docker - 升级基本图像

Docker - Upgrading base Image

我有一个 base 被 100 个应用程序使用。所有 100 个应用程序在它们的 Dockerfile 中都有共同的基础镜像。现在,我正在升级基础映像以进行 OS 升级或其他一些升级并升级版本,并且我还标记了最新版本。 在这里,问题是,每当我更改基本映像时,所有 100 个应用程序都需要更改其 dockerfile 中的基本映像并重建应用程序以使用最新的基本映像。 有没有更好的方法来处理这个问题?

注意:-我是 运行 我在 Kubernetes 中的容器,每个应用程序的 Dockerfile 都在 GIT 中。

如果您需要部署最后一个版本的基础镜像,是的,您需要再次构建、标记、推送、拉取和部署每个容器。如果您的基本图像没有正确标记,您将需要更改所有 100 个文件的 docker 文件。

但是你有一些选择,比如使用 sed 来替换你 docker 文件中的所有出现,并从 sh 执行所有构建命令文件 指向每个应用程序目录。

使用 docker-compose,您可以使用一条命令更新 运行 100 个应用程序:

docker stack deploy --compose-file docker-compose.yml

但仍然需要重建容器。

编辑: 使用 docker compose 你也可以用一个命令构建 100 个容器,你需要在一个 compose 文件中定义所有容器,检查 compose file.

的码头

如果每个应用使用 base-image:latest,则无需更改 Dockerfile。尽管在基础映像更新后,您必须重建应用程序映像。之后,您需要更新应用程序才能使用新图像。

例如使用来自答案

的建议

您可以使用 Dockerfile ARG 指令修改 FROM 行(请参阅 Dockerfile 文档中的 Understand how ARG and FROM interact)。一种可能的方法是让您的 CI 系统注入基本图像标签。

ARG base=latest
FROM me/base-image:${base}
...

这有个别开发人员会基于较旧的基础映像构建测试映像的风险;如果图像之间的差异只是 OS 个补丁,那么您可能会认为这是一个可以接受的小风险,只要只有官方图像被推送到生产环境即可。

除此之外,除了修改各个 Dockerfile 之外没有太多替代方案。你可以编写脚本

# Individually check out everything first
BASE=$(pwd)
TAG=20191031
for d in *; do
  cd "$BASE/$d"
  sed -i.bak "s@FROM me/base-image.*@FROM:me/base-image:$TAG/" Dockerfile
  git checkout -b "base-image-$TAG"
  git commit -am "Update Dockerfile to base-image:$TAG"
  git push
  hub pull-request --no-edit
done

也有自动依赖项更新工具,这些工具可能能够为您管理它的脚本方面。

whenever I change the base image, all 100 application needs to change the base image in their dockerfile and rebuild the app for using the latest base image.

这是一个功能,不是错误;在继续使用新图像之前,所有 100 个应用程序都需要 运行 他们的测试(并可能修复任何回归)...

有一些工具可以扫描所有的 repos 并自动向 100 个应用程序提交拉取请求(或者你可以编写一个自定义的,如果你在 Dockerfile 中没有简单的 "FROM" 行) .