我喜欢使用docker-compose。
EG。在我的服务器上,当我想通过微小的更改来更新我的应用时,我只需要addElement (addElement ... elem) elem
,效果很好。
但有时,我需要重建(例如,我添加了npm依赖项,需要再次运行git pull origin master && docker-compose restart
)。
在这种情况下,我做npm install
。
我希望这会:
但实际上它似乎又重新启动了前者。
这是预期的行为吗?
我如何处理重建并在构建之后启动新的?
也许我错过了一个特定的命令?或者它有意义吗?
答案 0 :(得分:18)
如果您对docker-compose.yml配置进行了更改 运行此命令后,不会反映更改。
你应该可以做到
$docker-compose up -d --no-deps --build <service_name>
--no-deps
无法启动链接服务。
答案 1 :(得分:16)
问题是restart
将重启您当前的容器,这不是您想要的。
举个例子,我刚刚做了这个
docker-compose build
制作图片docker-compose down
1 和docker-compose up
docker-compose restart
不会在这里工作docker-compose start
代替也不起作用说实话,我并不完全确定你需要先down
,但这应该很容易检查。 1 底线是你需要致电up
。您将看到未更改的图像的容器重新启动,但对于更改的图像,您将看到recreating
。
这比调用up --build
更有优势的是,您可以在重新启动之前先看到构建过程。
1:来自评论;不需要向下,您只需拨打up --build
即可。 Down有一些&#34; down-34; -sides,包括可能破坏你的(音量)数据。
答案 2 :(得分:7)
使用--build
命令的up
标志以及-d
标志在后台运行容器:
docker-compose up -d --build
这将重建您在撰写文件中定义的所有图像,然后重新启动其图像已更改的所有容器。
-d
假设您不希望在shell前台运行所有内容。这使得它更像restart
,但不是必需的。
答案 3 :(得分:4)
不要直接管理您的应用程序环境。使用Rancher之类的部署工具。有了它,您将能够在没有任何停机的情况下升级您的dockerized应用程序,甚至可以根据需要对其进行降级。
运行Rancher就像运行另一个docker容器一样简单,因为此工具可用in the Docker Hub。
答案 4 :(得分:3)
您可以使用Swarm。首先通过docker swarm init
命令初始化集群,然后在docker-compose.yml中使用healthcheck
。
然后运行以下命令:
docker stack deploy -c docker-compose.yml project_name
代替
docker-compose up -d
。
当docker-compose.yml文件更新时,仅再次运行以下命令:
docker stack deploy -c docker-compose.yml project_name
Docker Swarm将创建新版本的服务,然后停止旧版本。
答案 5 :(得分:3)
尽管在开始更换新容器之前可以接受已接受的答案来重建容器,但是对于简单的用例来说是可以的,但是在新的容器初始化过程中容器仍将关闭。如果时间太长,可能会成为问题。
我设法通过docker-compose
(以及nginx
反向代理)实现了滚动更新,并详细说明了我如何在github问题中构建该更新:https://github.com/docker/compose/issues/1786#issuecomment-579794865
希望它能提供帮助!
答案 6 :(得分:0)
另一种方式:
您的情况下的 docker-compose restart
可以替换为docker-compose up -d --force-recreate
,请参见https://docs.docker.com/compose/reference/up/
答案 7 :(得分:0)
运行以下命令:
docker-compose pull
docker-compose up -d --no-deps --build
作为最受好评的答案 docker-compose up -d --no-deps --build <服务名称> 将重新启动一项服务,而不会减少整个撰写过程。 我只是想添加到最上面的答案,以防万一有人不确定如何在不重新启动容器的情况下更新映像。