我的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配置文件不依赖“不忘记”的命令行上的东西每次调用?

ps.除了想办法实现我的目标,我也很想多了解一下这种行为的背景。我认为Docker的基本思想是构建一个不可变的基础设施。docker-compose当前的行为似乎与这种方法明显冲突。还是我漏掉了什么?


当前回答

docker-compose up --build  # still use image cache

OR

docker-compose build --no-cache  # never use cache

其他回答

docker-compose up—force- rebuild是一种选择,但如果你正在使用它进行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

重新创建容器的原因是为了保存可能使用的任何数据量(而且它的生成速度也快得多)。

如果你在做CI,你不会想要那样,所以只要去掉所有东西就能得到你想要的。

更新:use up -build,这是在docker-compose 1.7中添加的

你可以将——force- rebuild传递给docker compose up,它应该使用新的容器。

我认为重用容器的原因是为了在开发过程中保留任何更改。注意,Compose对卷做了类似的处理,卷也将在容器重新创建之间保持存在(重新创建的容器将附加到其前任的卷上)。这是很有用的,例如,如果你有一个Redis容器用作缓存,你不想每次做一个小的改变都失去缓存。其他时候,它只是令人困惑。

我不相信有任何方法可以强制从撰写文件。

可以说,它确实与不变的基础设施原则相冲突。相反的观点可能是,您(目前)还没有在生产中使用Compose。此外,我不确定我是否同意不可变基础设施是Docker的基本思想,尽管它确实是一个很好的用例/卖点。

根据当前的官方文档,有一个快捷方式可以停止和删除up创建的容器、网络、卷和图像,如果它们已经停止或部分删除,那么它也可以做到这一点:

docker-compose down

然后,如果你在你的图像或dockerfile上有新的变化,使用:

docker-compose build --no-cache

最后:docker-compose

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

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

docker-compose build --no-cache

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

$docker-compose build

如果有新的东西,它将被重建。