通过docker-compose仅更新一个Container

时间:2016-08-26 14:06:06

标签: docker docker-compose

我们说我有一个 docker-compose.yml 文件,其中包含五个应用程序&我是通过docker-compose up -d启动的。现在有一个一个这些应用程序的更新,我想使用它们。所以我拉出这个更新的图像......我怎么能停止这个旧容器而不停止其他四个容器

  • 使用docker-compose down && docker-compose up -d会停止并重新启动我的所有容器,这样就错了。
  • 使用docker stop app_1 && docker run app_1会起作用,但似乎错误"对我而言,因为它没有docker-compose命令。

那么" docker-way"这样做?

3 个答案:

答案 0 :(得分:5)

再次运行docker-compose up -d(之前不使用down / stop / kill)。

初始docker-compose.yml

version: "2"

services:
  db1:
    command: mongod
    image: mongo:3.2.4
    ports:
      - "27020:27017"

  db2:
    command: mongod
    image: mongo:3.2.4
    ports:
      - "27021:27017"

更新db2

version: "2"

services:
  db1:
    command: mongod
    image: mongo:3.2.4
    ports:
      - "27020:27017"

  db2:
    command: mongod
    image: mongo:3.2.6
    ports:
      - "27021:27017"

再次运行docker-compose up -d

Pulling db2 (mongo:3.2.6)...
3.2.6: Pulling from library/mongo
47994b92ab73: Pull complete
a3ed95caeb02: Pull complete
71b6becd9768: Pull complete
7d5d40f9dc7b: Pull complete
9dc152e647de: Pull complete
3f1f69340f17: Pull complete
82a29b50f1d2: Pull complete
97869c61a050: Pull complete
50aa2bf3bccc: Pull complete
03913f2c5b05: Pull complete
Digest: sha256:29ee114c0ce96494553cd72f18d92935b36778b77bce167fc9962e442d8c7647
Status: Downloaded newer image for mongo:3.2.6
composetest_db1_1 is up-to-date
Recreating composetest_db2_1 

输出的最后两行显示预期的行为。

答案 1 :(得分:2)

在一个用例中,接受的答案不起作用:

假设您有 4 个容器,其中 2 个有新版本,并且您只想更新/重启其中一个。

如果您再次执行 docker-compose up -d,这将更新两个容器。

如果您只想定位一个特定的容器,可以分两步完成:

  • 拉取所有更新:docker-compose pull(这只会下载图像,不执行任何其他操作)
  • 然后只更新你想要的容器:docker-compose up -d --no-deps name_of_your_container

--no-deps 对于避免错误地重新启动更新容器的依赖项很重要。

答案 2 :(得分:1)

很老的问题,但如果图像在 docker hub 上发生了更改并且我们不更改 docker 文件,则答案似乎不起作用,例如如果我在上面的示例中使用最新版本的 mongo (mongo:latest) 并且“latest”标签在 Docker Hub 中从 3.2.4 移动到 3.2.6,则不会仅通过运行 {{1}就我所见...