通过docker-compose仅更新一个Container

Mun*_*kin 3 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命令.

那么这个"码头工作者"是什么?

Ant*_*oin 42

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

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

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

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

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

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


小智 7

要仅重新启动一个容器,您可以简单地执行以下操作:

docker-compose up -d --build image-name
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

Recreating image-name ... done
Run Code Online (Sandbox Code Playgroud)


Ale*_*ler 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"
Run Code Online (Sandbox Code Playgroud)

更新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"
Run Code Online (Sandbox Code Playgroud)

再跑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 
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我尝试这样做,我会收到很多错误消息“容器名称已在使用中”。 (2认同)