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

How to get docker-compose to always re-create containers from fresh images?

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

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

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

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

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

您可以将 --force-recreate 传递给 docker compose up,这应该使用新鲜的容器。

我认为重用容器背后的原因是为了保留开发过程中的任何更改。请注意,Compose 对卷做了类似的事情,它也将在容器重建之间持续存在(重新创建的容器将附加到其前身的卷)。这可能很有帮助,例如,如果您将 Redis 容器用作缓存并且您不想在每次进行小的更改时都丢失缓存。在其他时候,它只是令人困惑。

我不认为有任何方法可以从 Compose 文件强制执行此操作。

可以说它确实与不变的基础设施原则相冲突。反对意见可能是您还没有在生产中使用 Compose。另外,我不确定我是否同意不可变基础设施是 Docker 的基本思想,尽管它肯定是一个很好的用途 case/selling 点。

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

这是我用的:

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

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

如果你正在做 CI 你不想要那个,所以只需删除所有内容就可以得到你想要的。

更新:使用在 docker-compose 1.7

中添加的 up --build
$docker-compose build

如果有新的东西会重建。

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

docker-compose build --no-cache

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

目前官方documentation有一个快捷方式可以停止和删除up创建的容器,网络,卷和图像,如果它们已经停止或部分删除等等,那么它就可以了技巧也是:

docker-compose down

然后,如果您对图像或 Dockerfile 进行了新更改,请使用:

docker-compose build --no-cache

最后:docker-compose up

在一个命令中: docker-compose down && docker-compose build --no-cache && docker-compose up

docker-compose up --build

docker-compose build --no-cache

我通过这个在 ubuntu AWS 中申请了 3.5gb space。

干净docker

docker stop $(docker ps -qa) && docker system prune -af --volumes

重新构建

docker build .

docker-compose build

docker-compose up

此外,如果组合有多项服务,而我们只想强制构建其中一项:

docker-compose build --no-cache <service>