我的目标是为我的应用程序构建一个 docker 镜像,应用程序的核心部分是在镜像构建过程中通过 RPM 安装的。
假设我已经使用“application-version-1.rpm”文件构建了 docker 镜像,并且容器正在使用该镜像运行。一两个月后,开发人员发布了带有补丁“application-version-2.rpm”的新 rpm,我需要在正在运行的容器内安装/升级此 rpm 文件。由于此容器正在生产中运行,我如何使用现有数据和新发布的 rpm 文件更新我的镜像。对此有任何想法。
注意:我需要停止应用程序服务来安装/升级新的 rpm 文件。我的 docker 镜像中的入口点是应用程序服务。因此,如果我停止应用程序服务,它将停止容器。
最佳答案
您基本上永远不会在正在运行的 Docker 容器内进行软件更新。相反,您可以构建一个安装了新软件的新 Docker 镜像,停止现有容器,然后使用新镜像启动一个新容器。
docker run --name myapp ... myapp:1
# Time passes
docker build --no-cache -t myapp:2 .
docker stop myapp
docker rm myapp
docker run --name myapp ... myapp:2
像这样删除容器是非常例行公事的,因此,如果您关心任何数据,则需要使用 docker run -v
选项确保将其存储在容器外部。
如果您使用 Docker Compose 作为编排器,您可以docker-compose stop
现有容器,然后再次docker-compose up --build
;或者您可以使用 docker build 手动重建镜像并更改 docker-compose.yml 文件中的 image: 行。如果您使用 Kubernetes 部署,更改 pod 规范中的 image:
实际上会导致它首先启动一个新容器 (pod),然后删除旧容器,以实现零停机更新。
关于linux - 构建具有 RPM 升级 future 前景的 Docker 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57552200/