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

如何定义使用docker compose构建的图像的名称,docker,docker-compose,orchestration,Docker,Docker Compose,Orchestration,我正在使用创建我的开发环境。我想建立一个特定的图像,但我不知道如何设置该图像的名称 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=elast

我正在使用创建我的开发环境。我想建立一个特定的图像,但我不知道如何设置该图像的名称

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标签mynewtag:version


之后,当您转到
docker images
时,您将看到您的图像不再命名为
,根据您的使用情况,您可以使用已创建的图像,并在
docker compose
中指定其名称

我们有一个生产用例,其中CI服务器构建了一个命名的Docker映像。(
docker build-t.
)。一旦指定了命名图像,我们的
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
根据:

如果使用新的文件格式,现在可以同时指定生成密钥和图像密钥
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:提示默认图像名称 默认情况下,docker compose生成的图像的名称取决于文件夹名称,但您可以使用
--project name
参数覆盖它:

$ docker-compose --project-name foo build bar
$ docker images foo_bar
选项2:指定图像名称 一旦docker compose 1.6.0发布,您可以指定
构建:
图像:
以具有明确的图像名称(请参阅)

选项3:从容器创建图像 第三种方法是从容器中创建图像:

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

对于docker compose版本2文件格式,您可以为一个服务生成并标记一个映像,然后将该映像用于另一个服务

在我的例子中,我想设置一个包含2个节点的elasticsearch集群,它们都需要使用相同的映像,但配置为以不同的方式运行。我还想从我自己的Dockerfile构建我自己的自定义elasticsearch图像。这就是我所做的(
docker compose.yml
):

您可以看到,在第一个服务定义
es master
中,我使用
build
选项从
/elasticsearch
中的Dockerfile构建一个映像。我用名称
porter/elasticsearch
image
选项标记图像。

然后,我使用
image
选项在
es节点
服务定义中引用此构建的映像,并使用
dependens\u on
确保先构建并运行另一个容器
es master。

根据Docker compose的3.9版本,您可以使用
image:myapp:tag
指定名称和标记

版本:“3.9”
服务:
网络应用程序:
建造:
上下文:。
dockerfile:dockerfile
图片:webapp:tag

参考:

是否可以使用docker compose指定标记?此时似乎不支持标记。因此我必须生成图像,然后重新标记它?不是很有用,我希望docker compose能很快解决这个问题?如果你正在构建一个多容器环境,是的。如果您正在构建单个容器环境,则始终可以转到docker build-t mytag:version。
如果您使用docker compose来构建映像,映像名称始终将是
,其中
在本例中是
wildfly
,project默认为您所在的目录名。您可以使用
-p
COMPOSE\u PROJECT\u NAME
环境变量来更改该值。无法设置自定义图像名称。是否没有可接受的答案?-关于此主题的正式文档您还可以在
.env
中设置
COMPOSE\u PROJECT\u NAME=x
,您的容器将被称为
{x}{service}}
错误:验证失败,原因:cornsoup同时指定了映像和构建路径。服务可以构建为映像,也可以使用现有映像,但不能同时使用两者。(docker compose 1.6.2)@zx1986为此,您必须使用docker-compose.yml文件的新版本,请根据更新后的我的答案参考此选项
容器\u name:
真的很有帮助。您确定这有效吗<代码>构建和
图像
是互斥的。我得到“服务xxx同时指定了映像和构建路径。服务可以按照映像构建,也可以使用现有映像,而不是同时使用两者。”哦,没关系。这两种格式可在v2及以后的版本中一起使用。我正在测试的东西没有指定版本,所以我想应该是v1。容器名称:这个选项真的帮助了我thks@BrunoBieri
dependens\u on
使用
doker compose
文件中的服务名称,无需指定容器名称。即使示例显示它
依赖于:es master
,而不是
依赖于:es\u master
——项目名称似乎不再被接受。使用1.23。2@StevenVachon根据这些文档,
--project name
应该可以工作,但是他们的示例使用了
-p
:--project name被删除了。您可以使用env
COMPOSE\u PROJECT\u NAME=foo docker COMPOSE up
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