如何定义使用docker-compose构建的映像的名称


202

我正在使用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所有操作时,一切正常,但是我得到了新图像的随机名称。是否可以为构建映像设置名称?


17
如果使用docker-compose生成映像,则映像名称始终为<project>_<service><service>在此示例中为wildfly,项目默认为您所在的目录名称。您可以使用-pCOMPOSE_PROJECT_NAME环境变量来更改它。无法设置自定义图像名称。
dnephin

1
没有可接受的答案吗?
AmanicA


2
您也可以设置COMPOSE_PROJECT_NAME=x.env然后将您的容器命名为{x}_{service}_{#}
eMPee584 '18

Answers:


181

对于docker-compose版本2文件格式,您可以为一个服务构建并标记映像,然后将相同的构建映像用于另一服务。

就我而言,我想设置一个具有2个节点的弹性搜索集群,它们都需要使用相同的图像,但是配置为以不同的方式运行。我还想根据自己的Dockerfile构建自己的自定义elasticsearch映像。这就是我所做的(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”选项在“ es-node”服务定义中引用此构建的映像,并使用“ depends_on”来确保首先构建并运行另一个容器“ es-master”。


55
该选项container_name:确实有所帮助。
Bruno Bieri

2
您确定这有效吗?build并且image是互斥的。我得到“服务xxx同时指定了映像和构建路径。可以构建服务以映像或使用现有映像,不能同时使用两者。”
Burhan Ali

3
哦,没关系。这两个版本可以在v2格式及更高版本中一起使用。我正在测试的东西没有指定版本,所以我想应该是v1。
Burhan Ali

3
选项container_name:确实帮了我大忙
lanni654321

2
@BrunoBieri depends_on使用doker-compose文件中服务的名称,无需指定容器名称。即使是例子显示它depends_on: es-master并没有depends_on: es_master
blueFast

65

按照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

1
错误:验证失败,原因:cornsoup同时指定了映像和构建路径。服务可以构建为映像或使用现有映像,不能同时使用两者。(
docker

@ zx1986表示您必须使用新版本的docker-compose.yml文件,请参阅此docs.docker.com/compose/compose-file/#upgrading基于更新的答案
arulraj.net,2016年

50

选项1:提示默认图片名称

docker-compose生成的映像的名称默认情况下取决于文件夹名称,但是您可以使用--project-name参数覆盖它:

$ docker-compose --project-name foo build bar
$ docker images foo_bar

选项2:指定图片名称

一旦泊坞窗,撰写1.6.0出来了,你可以指定build:,并image:有明确的映像名称(见arulraj.net的答案)。

选项3:从容器创建图像

第三是从容器创建图像:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar

1
--project-name似乎不再被接受。使用1.23.2
Steven Vachon

21

根据您的用例,您可以使用已经创建的图像,并在中指定其名称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

10

构建映像后,请执行以下操作:

docker tag <image id> mynewtag:version

之后,你会看到你的形象不再命名<none>,当你去docker images


3
可以使用docker-compose指定标签吗?
罗伯特

标签目前不支持。
GHETTO.CHiLD,2015年

1
因此,我必须构建图像并在以后重新标记它?并不是真的有用,我希望docker-compose可以快速解决此问题?
罗伯特

1
如果要构建多容器环境,则可以。如果您要建立一个单一的容器环境,则可以随时进行docker build -t mytag:version .
GHETTO.CHiLD,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.