如何使用docker-compose重build和更新容器而无需停机?

我喜欢使用docker-compose。

例如。 在我的服务器上,当我想要更新我的应用程序时,只需稍作更改,我只需要git pull origin master && docker-compose restart ,完美地工作。

但有时候,我需要重新编译(例如,我添加了npm依赖项,需要再次运行npm install )。

在这种情况下,我做了docker-compose build --no-cache && docker-compose restart

我期望这样做:

  • 创build我的容器的一个新的实例
  • 停止现有的集装箱(在较新的build筑物完成之后)
  • 开始新的一个
  • 可以select删除旧的,但可以手动完成

但在实践中,似乎又重新开始了前者。

这是预期的行为?

如何处理重build,并build成开始新build?

也许我错过了一个特定的命令? 还是有意义呢?

从手动docker-compose重启

如果您对docker-compose.ymlconfiguration进行了更改,则在运行此命令后,这些更改将不会被反映出来。

你应该可以做到

 $docker-compose up -d --no-deps --build <service_name> 

--no-deps不会启动链接的服务。

问题是, restart将重新启动您当前的容器,这不是你想要的。

举个例子,我只是做了这个

  • 更改其中一个图像的docker文件
  • 调用docker-compose build来构build图像
  • 呼叫docker-compose down 1docker-compose up
    • docker-compose restart在这里不起作用
    • 使用docker-compose start代替也不起作用

说实话,我并不完全确定你需要先做一个,但这应该很容易检查。 1底线是你需要打电话。 您将看到未更改映像的容器重新启动,但对于已更改的映像,您将看到正在recreating

这只是调用up --build的优点是,你可以在重新启动之前先看到构build过程。

1:来自评论; down不需要,你可以调用up --build 。 羽绒服有一些“倒”,包括可能破坏你的(数量)数据。

使用up命令的--build标志以及-d标志在后台运行你的容器:

 docker-compose up -d --build 

这将重build您的撰写文件中定义的所有图像,然后重新启动任何图像已更改的容器。

-d假定你不想让所有的东西在你的shell前台运行。 这使得它更像restart ,但并不是必需的。

不要直接pipe理你的应用程序环境。 使用像Rancher这样的部署工具。 有了它,您将能够升级您的dockerized应用程序,而无需任何停机时间,甚至可以根据需要进行降级。

运行Rancher与运行另一个Docker容器一样简单,因为Docker Hub上提供了此工具。