为什么docker compose在使用'-p';旗帜

为什么docker compose在使用'-p';旗帜,docker,docker-compose,Docker,Docker Compose,我们在Docker容器中运行Jenkins服务器,我从一位离开的同事那里接管了该容器。 我看到了一些我不理解的行为,并且无法从文档中了解到发生了什么。 我的文件夹结构如下所示: └── Master ├── docker-compose.yml └── jenkins-master └── Dockerfile 我的docker-compose.yaml文件如下所示(这只是相关部分的一个片段): 我已经在Jenkins master/Dockerfile中更新了

我们在Docker容器中运行Jenkins服务器,我从一位离开的同事那里接管了该容器。 我看到了一些我不理解的行为,并且无法从文档中了解到发生了什么。 我的文件夹结构如下所示:

└── Master
    ├── docker-compose.yml
    └── jenkins-master
        └── Dockerfile
我的docker-compose.yaml文件如下所示(这只是相关部分的一个片段):

我已经在
Jenkins master/Dockerfile
中更新了基本Jenkins映像的版本,然后使用
docker compose build
重新构建。 这将成功并产生一个名为
master\u master
如果我运行
docker images
我会看到这个新图像和以前的图像:

REPOSITORY        TAG      IMAGE ID    CREATED          SIZE
master_master     latest   <id1>       16 hours ago     704MB
jenkins_master    latest   <id2>       10 months ago    707MB
创建的存储库标记图像ID大小
master_master最近16小时前704MB
jenkins_master最近10个月前的707MB
据我所知,名称
master\u master
是基本文件夹名称(即
master
)和
docker compose.yaml
文件中
master
的服务名称的结果。 我不知道现有图像如何以名称
jenkins\u master
结束。文件夹名称是否必须是
Jenkins
而不是
Master
,或者是否有其他方式产生此名称

当我运行
docker compose up-d
时,它使用
master\u master
图像启动一个容器(称为
master\u master\u 1

当我运行
docker compose-p jenkins up-d
时,它使用
jenkins\u master
图像启动一个容器(称为
jenkins\u master\u 1

除了不同的容器名称外,生成的运行容器也不同,因为我可以看到Jenkins版本不同(根据我在Dockerfile中所做的更改)。 在运行这两个命令和运行不同的图像之间,我根本不会更改docker compose文件

我找到的用于指定-p(--project name)标志的文档说明:

设置项目名称。此值与服务一起预先设置 启动时容器的名称。例如,如果您的项目名称 是
myapp
,它包括两个服务
db
web
,然后组合 分别启动名为
myapp\u db\u 1
myapp\u web\u 1
的容器

此设置是可选的。如果未设置此项,则
COMPOSE\u PROJECT\u NAME
默认为项目的
basename
目录

没有什么能让我相信
-p
标志会导致运行不同的映像

这是怎么回事? docker compose如何选择要运行的映像?
发生这种情况是因为docker-compose.yml文件中的image
master\u master
vs
jenkins\u master

添加image选项的名称。它将使用指定的docker映像创建容器

build: ./jenkins-master
image: dockerimage_name:tag

如果要使用
docker compose-p
选项,则需要将其与每个
docker compose
命令一起使用,包括
docker compose build

如果您的
docker compose.yml
文件未指定
图像:
,则compose将根据当前项目名称和compose服务名称构造图像名称。项目名称和Docker对象元数据是它记住任何内容的唯一方式。因此,这里发生的事情是普通的
docker compose build
master
项目中的
master
服务构建映像,但是
docker compose-p jenkins up
jenkins
项目中查找
master
服务,并找到另一个映像

docker-compose -p jenkins build
docker-compose -p jenkins up -d

设置环境变量可能会更容易,也可能不会更容易,可能会将其放在一个特定的位置。在詹金斯上下文中,我也可以考虑使用(构建和推送)图像,而只引用<代码>图像:<代码> <代码> DOCK撰写。YLL>代码>文件。

我感谢响应,并且我理解这将做什么,但是这不能回答我的问题。我试图理解为什么docker compose仅仅因为指定了-p标志就运行两个不同的图像。我本以为它会运行同一个映像,但容器的名称会有所不同。
docker-compose -p jenkins build
docker-compose -p jenkins up -d