如何使用docker-compose更新现有图像?

Efe*_*Efe 28 docker gitlab-ci docker-compose

我有多个微服务,我anonymous用于开发部署.当微服务代码库发生一些变化时,我会触发ci job来重新部署它们.我有以下脚本来做到这一点.但每次我必须从头开始构建所有图像然后运行它们.完成所有这些操作后,我有了gitlab-ci图像.所以我使用最后一个脚本删除它们.你建议什么使这个过程更实用?有没有办法更新现有图像而不用新的更改删除它?

- docker-compose build
- docker-compose down
- docker-compose up -d --force-recreate
- docker rmi $(docker images -f "dangling=true" -q) -f
Run Code Online (Sandbox Code Playgroud)

附加信息:我正在使用 anonymous

小智 69

我更喜欢确保在使用新图像更新容器之前下载所有图像,以最大限度地减少处于中间状态的时间,或者更糟的是处于中间状态,以防图像下载失败。

1)我拉最新的图像:

docker-compose pull
Run Code Online (Sandbox Code Playgroud)

2)然后我重新启动容器:

docker-compose up -d --remove-orphans
Run Code Online (Sandbox Code Playgroud)

3) 或者,我删除过时的图像:

docker image prune
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案,因为它不会强制使用“-f”或“--force-recreate”,这可能会产生破坏性的副作用。 (9认同)
  • 这是一个简单的 bash 脚本,因此您可以使用单个命令“./update-docker-compose-services.sh”运行它:https://pastebin.com/EdDA5hZ2 (6认同)

yam*_*enk 49

Docker容器设计为短暂的.要更新现有容器,请删除旧容器并启动新容器.因此,您所遵循的流程是正确的.

您可以将命令简化为以下命令:

docker-compose up --force-recreate --build
docker image prune -f
Run Code Online (Sandbox Code Playgroud)

  • 这似乎缺少“docker-compose pull”步骤。`--force-recreate` 不会提取更新的图像;它只是重新创建容器_即使图像没有改变。_ (18认同)
  • 你错过了docker-compose命令中的-d标志; 这是故意的吗? (13认同)
  • @k4rli,听起来您将所有设置存储在容器本身中,而不是存储在附加卷中(在删除容器后该卷仍然存在)。此外,“docker pull”不会升级正在运行的容器——您仍然需要删除并重新创建容器才能使拉取生效。 (9认同)
  • 我认为该标志很重要,因为不添加它将在前台运行所有内容,会话结束后立即杀死所有内容。添加它是因为许多(大多数?)人会发现 `-d` 有用/必要。 (5认同)
  • 这一切所做的就是将我的整个 pi-hole 重置为默认设置并丢失所有广告列表、白名单。`docker pull pihole/pihole:latest` 就足够了。 (3认同)

Snr*_*Snr 48

docker-compose pull
Run Code Online (Sandbox Code Playgroud)

然后

docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

你不需要“down”“docker-compose up -d”命令只会重新创建一个更改过的


Evg*_*nov 15

您可以使用以下方法更新它:

docker-compose pull
Run Code Online (Sandbox Code Playgroud)

现在,您的图像已更新。如果您正在运行以前版本的容器,则应重新启动它以使用更新的映像:

docker-compose restart
Run Code Online (Sandbox Code Playgroud)

  • 重新启动不起作用,因为它不会从拉取中重新创建容器,您必须再次执行“down”和“up -d”。 (18认同)
  • @hoo2你不想让我的答案更好吗,请描述容器何时自动从图像更新,何时不更新。老实说,我不知道也无法改进答案。“不太酷!” 本身并不酷。 (7认同)
  • 就我而言,它会自动重新创建。 (4认同)
  • 我认为 @yamenk 的评论和这个评论的结合是最好的方法 (4认同)
  • 我相信这种混乱来自于这样的效果,即没有“down”的“docker-compose up”只会为已更改的图像重新创建容器(即新版本可用)。如果您先调用“down”,所有容器都会被销毁,因此“up”将重新创建所有容器。如果您的目标只是使用最新映像更新容器,那么“docker-compose up -d”就足够了。如果您因任何其他原因需要重新创建容器,则需要事先使用“docker-compose down”。 (3认同)