不要使用docker创建容器两次,请组成并运行docker run容器

时间:2018-07-09 22:52:44

标签: docker docker-compose

我希望docker-compose将已经运行的容器用于imageA,而不是在调用docker-compose up -d时再次创建它。原始容器使用docker run运行。

步骤: 我以docker run开始了一个容器,例如。

docker run --name imageA -d -p 5000:5000 imageA

然后,我使用一个docker-compose up -d文件调用docker-compose.yml,该文件包含一个名称和图像与第一个容器相同的服务。

version: "3"
services:
  imageA:
    image: imageA
    ports:
      - "5000:5000"
  imageB:
    image: imageB
    ports:
      - "5001:5001"

会发生什么: docker-compose尝试创建imageA并尝试绑定端口5000时失败,因为容器imageA已被绑定。

问题:如何docker-compose“采用”或“包含”第一个容器而又不尝试再次创建它?

2 个答案:

答案 0 :(得分:0)

我不认为这目前是可能的。如果比较docker psdocker-compose ps的输出,则应注意docker-compose ps不会显示imageA在运行,如果它是由docker run开始的。

Docker-compose只对docker-compose文件中定义的服务感兴趣,它似乎不仅使用容器名称,还使用标签,并且您不能将标签添加到当前正在运行的容器中。

除此之外,以docker run开头的容器也将(至少默认情况下)与以docker-compose开头的容器不在同一内部网络中。

因此,最佳选择是: a)从撰写文件中删除已经运行的容器。 b)调用docker-compose up -d imageB仅运行单个服务,以便组合仅更新该服务或 c)只是停止已经运行的容器,然后使用compose重新启动它。

无论如何,应该以容易且可接受的方式创建Docker容器,只需在需要时重新启动它们即可。

答案 1 :(得分:0)

添加 --no-recreate 标志将阻止重新创建容器(如果容器已存在)。

示例:

docker-compose -f docker-compose-example.yaml up -d --no-recreate