327

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

4

9 回答 9

248

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

就我而言,我想建立一个有 2 个节点的弹性搜索集群,它们都需要使用相同的图像,但配置为以不同的方式运行。我还想从我自己的 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从 Dockerfile 中构建映像的选项./elasticsearchporter/elasticsearch我用选项的名称标记图像image。然后,我使用选项在服务定义
中引用这个构建的映像,并使用 a来确保首先构建并运行另一个容器。es-nodeimagedepends_ones-master

于 2016-02-26T21:35:26.190 回答
93

根据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
于 2015-11-27T06:49:54.777 回答
70

选项 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 的答案)。

选项 3:从容器创建图像

第三种是从容器创建图像:

$ docker-compose up -d bar
$ docker commit $(docker-compose ps -q bar) foo_bar
$ docker-compose rm -f bar
于 2016-02-02T16:26:54.337 回答
27

根据您的用例,您可以使用已创建的图像并在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
于 2015-08-27T22:18:51.320 回答
22

根据 Docker compose 3.9 版本,可以使用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/

于 2021-01-29T19:48:39.960 回答
13

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

docker tag <image id> mynewtag:version

<none>之后你会看到你的图像不再被命名docker images

于 2015-08-26T15:55:36.610 回答
0

sudo docker-compose -p <项目名称> 构建

分配项目名称

注意:'-p' 选项位于命令中的 'build' 之前

参考:https ://docs.docker.com/compose/reference/

于 2021-06-18T06:35:47.087 回答
0

如果您指定图像和构建,则 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
于 2021-11-30T11:30:45.590 回答
0

您可以在 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
于 2022-01-24T19:58:52.743 回答