如何定义使用 docker-compose 构建的图像的名称
Posted
技术标签:
【中文标题】如何定义使用 docker-compose 构建的图像的名称【英文标题】:How do I define the name of image built with docker-compose 【发布时间】:2015-11-20 17:25:51 【问题描述】:我正在使用docker-compose 创建我的开发环境。我想构建一个特定的图像,但我不知道如何为该图像设置名称。
wildfly:
build: /path/to/dir/Dockerfile
container_name: wildfly_server
ports:
- 9990:9990
- 80:8080
environment:
- mysql_HOST=mysql_server
- MONGO_HOST=mongo_server
- ELASTIC_HOST=elasticsearch_server
volumes:
- /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
links:
- mysql:mysql_server
- mongo:mongo_server
- elasticsearch:elasticsearch_server
当我执行docker-compose
时,一切正常,但我得到了新图像的随机名称。是否可以为构建映像设置名称?
【问题讨论】:
如果您使用 docker-compose 构建镜像,镜像名称将始终为<project>_<service>
,其中<service>
在此示例中为wildfly
,项目默认为目录您所在的名称。您可以使用-p
或COMPOSE_PROJECT_NAME
环境变量来更改它。无法设置自定义图像名称。
没有可接受的答案吗?
docs.docker.com/docker-cloud/apps/service-links - 关于这个主题的官方文档
您也可以在.env
中设置COMPOSE_PROJECT_NAME=x
,您的容器将被称为x_service_#
注意: 因为 Docker 容器名称必须是唯一的,如果您指定了自定义名称,则不能将服务扩展到超过 1 个容器。尝试这样做会导致错误。 documentation
【参考方案1】:
构建映像后,请执行以下操作:
docker tag <image id> mynewtag:version
之后,当您转到 docker images
时,您将看到您的图像不再命名为 <none>
。
【讨论】:
可以用docker-compose指定标签吗? 目前似乎不支持标签。 所以我必须构建图像然后重新标记它?是不是真的有用,希望docker-compose快点解决这个问题? 如果您正在构建多容器环境,可以。如果你正在构建一个单一的容器环境,你总是可以去docker build -t mytag:version .
【参考方案2】:
根据您的用例,您可以使用已创建的图像并在docker-compose
中指定其名称。
我们有一个生产用例,其中我们的 CI 服务器构建一个命名的 Docker 映像。 (docker build -t <specific_image_name> .
)。一旦指定了命名图像,我们的docker-compose
总是建立在特定图像的基础上。这允许几种不同的可能性:
1- 您可以确保无论从何处运行 docker-compose
,您将始终使用该特定图像的最新版本。
2- 您可以在 docker-compose
文件中指定多个命名图像,并让它们通过上一个构建步骤自动连接。
因此,如果您的镜像已经构建,您可以使用docker-compose
命名镜像。删除build
并指定image:
wildfly:
image: my_custom_wildfly_image
container_name: wildfly_server
ports:
- 9990:9990
- 80:8080
environment:
- MYSQL_HOST=mysql_server
- MONGO_HOST=mongo_server
- ELASTIC_HOST=elasticsearch_server
volumes:
- /Volumes/CaseSensitive/development/wildfly/deployments/:/opt/jboss/wildfly/standalone/deployments/
links:
- mysql:mysql_server
- mongo:mongo_server
- elasticsearch:elasticsearch_server
【讨论】:
【参考方案3】:根据docker-compose 1.6.0:
如果您使用新的文件格式,您现在可以同时指定构建密钥和映像密钥。
docker-compose build
将构建图像并使用您指定的名称对其进行标记,而docker-compose pull
将尝试拉取它。
所以你的docker-compose.yml
会是
version: '2'
services:
wildfly:
build: /path/to/dir/Dockerfile
image: wildfly_server
ports:
- 9990:9990
- 80:8080
更新 docker-compose
sudo pip install -U docker-compose==1.6.0
【讨论】:
错误:验证失败,原因:cornsoup 同时指定了图像和构建路径。服务可以构建为映像或使用现有映像,不能同时使用两者。 (docker-compose 1.6.2) @zx1986 因为你必须使用新版本的 docker-compose.yml 文件参考这个docs.docker.com/compose/compose-file/#upgrading基于更新我的答案【参考方案4】:选项 1:提示默认图片名称
docker-compose 生成的镜像名称默认取决于文件夹名称,但您可以使用--project-name
参数覆盖它:
$ docker-compose --project-name foo build bar
$ docker images foo_bar
选项 2:指定图像名称
一旦 docker-compose 1.6.0 发布,您可以指定 build:
和 image:
以具有明确的图像名称(请参阅 arulraj.net's answer)。
选项 3:从容器创建图像
第三种是从容器中创建图像:
$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
【讨论】:
--project-name
似乎不再被接受。使用 1.23.2
@StevenVachon 根据文档,--project-name
应该可以工作,但他们的示例使用-p
:docs.docker.com/compose/reference/overview/…
--项目名称已被删除。您可以使用环境 COMPOSE_PROJECT_NAME=foo docker-compose up
【参考方案5】:
对于 docker-compose 版本 2 文件格式,您可以为一个服务构建和标记一个镜像,然后将相同构建的镜像用于另一个服务。
就我而言,我想建立一个有 2 个节点的 elasticsearch 集群,它们都需要使用相同的图像,但配置为不同的运行方式。我还想从我自己的 Dockerfile 构建我自己的自定义弹性搜索图像。所以这就是我所做的(docker-compose.yml
):
version: '2'
services:
es-master:
build: ./elasticsearch
image: porter/elasticsearch
ports:
- "9200:9200"
container_name: es_master
es-node:
image: porter/elasticsearch
depends_on:
- es-master
ports:
- "9200"
command: elasticsearch --discovery.zen.ping.unicast.hosts=es_master
您可以看到,在第一个服务定义中es-master
,我使用build
选项从./elasticsearch
中的Dockerfile 构建映像。我用名称 porter/elasticsearch
使用 image
选项标记图像。
然后,我使用image
选项在es-node
服务定义中引用这个构建的图像,并使用depends_on
来确保另一个容器es-master
首先构建并运行。
【讨论】:
container_name:
选项真的很有帮助。
你确定这有效吗? build
和 image
是互斥的。我得到“服务 xxx 指定了映像和构建路径。服务可以构建为映像或使用现有映像,而不是两者。”
哦,没关系。这两个可以在 v2 格式及更高版本中一起使用。我正在测试的东西没有指定版本,所以我猜应该是 v1。
选项 container_name: 真的帮了我的忙
@BrunoBieri depends_on
使用doker-compose
文件中的服务名称,无需指定容器名称。即使示例显示它depends_on: es-master
而不是depends_on: es_master
【参考方案6】:
根据3.9版本的Docker compose,可以使用image: myapp:tag
指定名称和标签。
version: "3.9"
services:
webapp:
build:
context: .
dockerfile: Dockerfile
image: webapp:tag
参考:https://docs.docker.com/compose/compose-file/compose-file-v3/
【讨论】:
是的,只要您有构建语句,它就可以工作。有点糟糕,你不能说 image: nginx:latest image-name: fred【参考方案7】:sudo docker-compose -p
分配项目名称
注意:'-p' 选项位于命令中的 'build' 之前
参考:https://docs.docker.com/compose/reference/
【讨论】:
【参考方案8】:如果你指定镜像和构建,那么 Compose 使用 webapp 和镜像中指定的可选标签命名构建的镜像:
image: webapp:tag
在 docker-compose 文件中,它看起来像。
version: '3.9'
services:
node-ecom:
build: .
image: "webapp:tag"
container_name: node-ecom
ports:
- "4000:3000"
volumes:
- ./:/app:ro
- /app/node_modules
- /config/.env
env_file:
- ./config/.env
【讨论】:
【参考方案9】:您可以自定义镜像名称以构建和容器名称在 docker-compose up 期间 为此,您需要在 docker-compose.yml 文件中提及如下.它将创建一个具有自定义名称的图像和容器。
version: '3'
services:
frontend_dev:
stdin_open: true
environment:
- CHOKIDAR_USEPOLLING=true
build:
context: .
dockerfile: Dockerfile.dev
image: "mycustomname/sample:v1"
container_name: mycustomname_sample_v1
ports:
- '3000:3000'
volumes:
- /app/node_modules
- .:/app
【讨论】:
以上是关于如何定义使用 docker-compose 构建的图像的名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在 docker-compose 中制作 React 应用程序?构建步骤完成后容器正在退出
13docker-compose快速构建搭建wordpress
如何让 docker-compose 始终从新图像重新创建容器?
Dockerfile 和 docker-compose.yml的区别