【问题标题】:How do I define the name of image built with docker-compose如何定义使用 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

标签: docker docker-compose orchestration


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2018-06-18
          • 1970-01-01
          • 2020-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-09
          相关资源
          最近更新 更多