我希望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
“采用”或“包含”第一个容器而又不尝试再次创建它?
答案 0 :(得分:0)
我不认为这目前是可能的。如果比较docker ps
和docker-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