同一docker compose服务位于多个文件夹中

同一docker compose服务位于多个文件夹中,docker,docker-compose,Docker,Docker Compose,我有一个包(bootstrap),它包含在多个本地项目中。例如: project1/: src/... tests/... vendor/bootstrap/... project2/: src/... tests/... vendor/bootstrap/... 这个包有它的内部测试和静态代码分析器,我想在每个projectX/vendor/bootstrap文件夹中运行它们。测试和分析器从docker容器中运行。也就是说,bootstrap

我有一个包(
bootstrap
),它包含在多个本地项目中。例如:

project1/:
    src/...
    tests/...
    vendor/bootstrap/...

project2/:
    src/...
    tests/...
    vendor/bootstrap/...
这个包有它的内部测试和静态代码分析器,我想在每个
projectX/vendor/bootstrap
文件夹中运行它们。测试和分析器从docker容器中运行。也就是说,bootstrap具有
docker compose.yml
和一些配置:

version: '3.7'
services:
  cli:
    build: docker/cli
    working_dir: /app
    volumes:
      - ./:/app
    tty: true
问题是当我在
project1/vendor/bootstrap
中运行某个东西,然后切换到
project2/vendor/bootstrap
并在那里运行某个东西时,docker认为我从project1执行容器。我相信这是因为Docker Compose与Docker Compose生成的容器名称相同,即
[folder-name\u service-name]
。因此,当我运行
docker compose exec cli sh
时,它会检查是否有正在运行的容器
bootstrap\u cli
,但它可以在另一个项目的另一个
bootstrap
文件夹中创建。
docker ps
示例:

CONTAINER ID        IMAGE            COMMAND                  CREATED             STATUS                PORTS        NAMES
128c3e834df4        bootstrap_cli    "docker-php-entrypoi…"   55 minutes ago      Up 55 minutes                      bootstrap_cli
名称
对于所有这些projectX文件夹中的容器都是相同的

有一个选项可以添加
容器\u name:bootstrap\u project1\u cli
,但Docker Compose在搜索正在运行的容器时似乎忽略了它


那么,是否可以区分相同名称的容器并同时拥有所有容器?

看看github的问题:

有两个选项可以设置COMPOSE_项目名称。使用
-p
命令行标志或
COMPOSE\u PROJECT\u NAME
环境变量。此处记录了这两种情况:

运行docker compose时,它需要容器的项目名称。如果不指定-p选项,docker compose将查找名为compose\u PROJECT\u NAME的环境变量。如果两者都未设置,则默认为当前工作目录。这就是你的行为


如果不想添加命令行参数,可以在docker compose文件目录中的
.env
文件中指定环境变量。请参见

docker compose基本上只是docker cli的包装器。它通过在容器(网络和卷)前面加上
compose\u PROJECT\u NAME
值,为compose文件中的服务提供了一些基本范围。如果未进行不同配置,则此值对应于撰写文件的目录名。您可以通过设置相应的环境变量来覆盖它。一个简单的解决方案是将
.env
文件放入包含如下指令的引导目录中

COMPOSE_PROJECT_NAME=project1_bootstrap
这将导致自动生成容器名称,例如
project1\u bootstrap\u cli\u 1

详情: