如何让 docker-compose 始终从新图像重新创建容器?

新手上路,请多包涵

我的 docker 镜像构建在 Jenkins CI 服务器上,并被推送到我们的私有 Docker Registry。我的目标是使用 docker-compose 提供环境,它总是启动图像的原始构建状态。

我目前在不同的机器上使用 docker-compose 1.3.2 和 1.4.0,但我们之前也使用过旧版本。

我总是使用 docker-compose pull && docker-compose up -d 命令从注册表中获取新图像并启动它们。我相信我的首选行为在某个时间点按预期工作,但从那时起 docker-compose up 开始重新运行先前停止的容器,而不是每次都启动最初构建的图像。

有没有办法摆脱这种行为?这种方式是否可以在 docker-compose.yml 配置文件中连接,以在每次调用时不依赖于命令行上的“不忘记”某些内容?

附言。除了找到实现目标的方法外,我还想更多地了解这种行为的背景。我认为 Docker 的基本思想是构建一个不可变的基础设施。 docker-compose 的当前行为似乎与这种方法完全冲突.. 还是我在这里错过了一些要点?

原文由 Kristof Jozsa 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

docker-compose up --force-recreate 是一种选择,但如果您将其用于 CI,我将使用 docker-compose rm -f 开始构建以停止并删除容器和卷(然后使用 pull 和 up )。

这就是我使用的:

 docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

重新创建容器的原因是为了保留可能使用的任何数据量(而且它也恰好使 up 更快)。

如果您正在做 CI,您不希望这样做,因此只需删除所有内容即可满足您的需求。

更新:使用 up --build 添加在 docker-compose 1.7

原文由 dnephin 发布,翻译遵循 CC BY-SA 3.0 许可协议

唯一对我有用的解决方案是 --no-cache 标志:

 docker-compose build --no-cache

这将自动从 repo 中提取一个新图像。它也不会使用使用您之前使用过的任何参数预构建的缓存版本。

原文由 davidbonachera 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题