我已经有一个用于各种事物的postgres和redis的运行容器。但是,几个月前我从命令行启动了这些。现在我正在尝试安装一个新的应用程序,其配方包括写出一个包含postgres和redis作为服务的docker compose文件。
是否可以通过指定已经运行的容器来修改撰写文件? Postgres已经很好地处理了任何数据,我无法想象重用正在运行的redis会有问题。
我应该重复使用它们吗?我发现我可以为这两个容器运行多个容器,我不确定是否会有任何缺点(除了混乱的docker ps输出)。
当我将container_name设置为现有容器的名称时,我得到的是我认为是一个相当典型的错误:
cb7cb3e78dc50b527f71b71b7842e1a1c". You have to remove (or rename) that container to be able to reuse that name.
其中一些人认为端口已经在使用(5432,6579等)。
Stackoverflow上的其他答案表明,如果我最初从具有完全相同细节的另一个撰写文件调用这些服务,我也可以在这里重复使用它并重用它们。但是我用来启动它们的命令在某种程度上从未写入我的bash_history,因此我甚至不确定细节(除名称,端口和重启之外)。
答案 0 :(得分:3)
您是否在寻找docker-compose的external_links
关键字?
external_links
允许您重复使用已经运行的容器。
根据docker-compose specification:
此关键字链接到在此docker-compose.yml之外或甚至在Compose之外启动的容器,尤其是对于提供共享或公共服务的容器。在指定容器名称和链接别名(CONTAINER:ALIAS)时,external_links遵循类似于遗留选项链接的语义。
这是语法:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
答案 1 :(得分:1)
您可以为容器命名。如果没有具有给定名称的容器,则这是第一次运行该映像。如果找到了命名的容器,请重新启动该容器。 这样,您可以重复使用容器。这是我的示例脚本。
containerName="IamContainer"
if docker ps -a --format '{{.Names}}' | grep -Eq "^${containerName}\$"; then
docker restart ${containerName}
else
docker run --name ${containerName} -d hello-world
fi
答案 2 :(得分:0)
您可能不想继续使用不知道如何创建的容器。然而,好消息是,您应该能够通过使用命令检查容器来了解如何再次创建容器
$ docker container inspect ID
这将显示所有设置,docker-compose特定的设置将在Config.Labels
下。对于跨项目的容器重用,您会对com.docker.compose.project
和com.docker.compose.service
的值感兴趣,以便您可以将它们传递给docker-compose --project-name
并将其用作{{1}中的服务名称1}}。