我们在测试管道中使用Docker compose并并行运行多个测试(来自同一提交,例如单元测试+静态类型测试+代码质量...)。问题在于,使用其中一种测试,我们需要启动docker-compose服务堆栈,然后在其中一个容器中exec
。
但是,由于我们运行测试的方式,docker-compose ps servicename
将返回多个ID。
我需要运行docker-compose up -d
并立即获取启动的服务的ID。不能使用docker-compose ps
。
有什么办法可以做到这一点?我想到的唯一方法是使用sed
将container_name
中的docker-compose.yml
替换为确定性的但唯一的名称,仅用于CI测试,但是感觉很脏。 >
答案 0 :(得分:0)
适合我的情况的是使用magic environment variable COMPOSE_PROJECT_NAME
。设置此变量并调用docker-compose
时,它将“自身”限制为该项目名称。
这意味着:
# Start a new stack of containers, overriding their project name (it defaults to the directory name)
$ COMPOSE_PROJECT_NAME=foobar docker-compose up -d
# This gives empty result
$ docker-compose ps
# This gives the containers started above
$ COMPOSE_PROJECT_NAME=foobar docker-compose ps
# This starts a whole new stack, not affecting the output of the commands above
$ COMPOSE_PROJECT_NAME=second docker-compose up -d
# This still only returns the services started in the first command
$ COMPOSE_PROJECT_NAME=foobar docker-compose ps
通过这种方式,我可以将COMPOSE_PROJECT_NAME
定义为由提交SHA和阶段/测试名称组成的块。这样可以使名称唯一,并避免冲突。
这与使用-p
的{{1}}参数具有相同的效果。