我的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的当前行为似乎与这种方法完全冲突..或者我在这里错过了一些观点?
答案 0 :(得分:177)
docker-compose up --force-recreate
是一个选项,但是如果您将它用于CI,我将使用docker-compose rm -f
启动构建以停止并删除容器和卷(然后使用pull and 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
1.7
docker-compose
答案 1 :(得分:85)
对我有用的唯一解决方案就是这个命令:
overridableFunction()
这将自动从repo中提取新图像,并且不会使用预先构建的缓存版本以及之前使用过的任何参数。
答案 2 :(得分:34)
通过当前官方documentation,有一个捷径可以停止并删除由up创建的容器,网络,卷和图像,如果它们已经停止或部分删除等等,那么它就可以完成太:
docker-compose down
然后,如果您对图像或Dockerfiles进行了新的更改,请使用:
docker-compose build --no-cache
最后:docker-compose up
在一个命令中:
docker-compose down && docker-compose build --no-cache && docker-compose up
答案 3 :(得分:14)
您可以将--force-recreate
传递给docker compose up
,{{1}}应使用新容器。
我认为重用容器背后的原因是在开发过程中保留任何更改。请注意,Compose与卷类似,它也将在容器重新创建之间保持不变(重新创建的容器将附加到其前任卷)。这可能很有用,例如,如果您将Redis容器用作缓存,并且每次进行小的更改时都不想丢失缓存。在其他时候,它只是令人困惑。
我不相信你有任何办法可以从Compose文件强制执行此操作。
可以说它确实与不可变的基础设施原则发生冲突。反驳可能是你在生产中没有使用Compose(还)。另外,我不确定我是否同意不可变的infra是Docker的基本思想,尽管它肯定是一个很好的用例/卖点。
答案 4 :(得分:7)
#include <stdio.h>
#define M(x) x - x
int main () {
printf ("%d %d\n",M(M (1+2)) , M(M (3)));
return 0;
}
或
6 -6
答案 5 :(得分:2)
我通过此方法在ubuntu AWS中声明了3.5gb的空间。
清洁码头工人
docker stop $(docker ps -qa)&& docker system prune -af --volumes
重新构建
docker build。
docker-compose build
docker-compose up
答案 6 :(得分:-5)
$docker-compose build
如果有新的东西,它将被重建。