【问题标题】:docker-compose up vs docker-compose up service1 service2docker-compose up vs docker-compose up service1 service2
【发布时间】:2018-12-18 23:17:27
【问题描述】:

我在下面有以下 docker-compose 文件。如果我运行 docker-compose up 一切正常。但是,如果我这样做docker-compose up minio1 minio2 minio3 minio4,则不会创建卷,并且我看不到以下日志。它不会创建我假设的卷。我在真正的 docker-compose.yml 文件中有许多其他服务,我不想一直运行 docker-compose up 并启动每个服务。我如何只启动这 4 个服务并创建卷/网络?

这不会出现在 docker-compose up minio1 minio2 ...

Creating volume "robot_models1" with default driver
Creating volume "robot_models2" with default driver  
Creating volume "robot_models3" with default driver  
Creating volume "robot_models4" with default driver

docker-compose.yml

version: '3'
services:
  minio1:
    image: minio/minio:RELEASE.2018-07-10T01-42-11Z
    volumes:
      - models1:/export
    ports:
      - "9001:9000"
    environment:
      MINIO_ACCESS_KEY: access123123
      MINIO_SECRET_KEY: secret123123
    command: server http://minio1/export http://minio2/export http://minio3/export http://minio4/export

  minio2:
    image: minio/minio:RELEASE.2018-07-10T01-42-11Z
    volumes:
      - models2:/export
    ports:
      - "9002:9000"
    depends_on:
      - minio1
    environment:
      MINIO_ACCESS_KEY: access123123
      MINIO_SECRET_KEY: secret123123
    command: server http://minio1/export http://minio2/export http://minio3/export http://minio4/export

  minio3:
    image: minio/minio:RELEASE.2018-07-10T01-42-11Z
    volumes:
      - models3:/export
    ports:
      - "9003:9000"
    depends_on:
      - minio2
    environment:
      MINIO_ACCESS_KEY: access123123
      MINIO_SECRET_KEY: secret123123
    command: server http://minio1/export http://minio2/export http://minio3/export http://minio4/export

  minio4:
    image: minio/minio:RELEASE.2018-07-10T01-42-11Z
    volumes:
      - models4:/export
    ports:
      - "9004:9000"
    depends_on:
      - minio3
    environment:
      MINIO_ACCESS_KEY: access123123
      MINIO_SECRET_KEY: secret123123
    command: server http://minio1/export http://minio2/export http://minio3/export http://minio4/export

  ## By default this config uses default local driver,
  ## For custom volumes replace with volume driver configuration.
volumes:
  models1:
  models2:
  models3:
  models4:

docker-compose 版本:

docker-compose version 1.21.2, build a133471
docker-py version: 3.4.1
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018

【问题讨论】:

    标签: docker docker-compose docker-for-mac


    【解决方案1】:

    试试:

    docker-compose up -d minio1 minio2 minio3 minio4

    这对我有用

    【讨论】:

      【解决方案2】:

      解决方案

      你必须执行这 4 个命令:

      docker-compose up minio1 
      docker-compose up minio2 
      docker-compose up minio3 
      docker-compose up minio4
      

      说明

      您不能执行docker-compose up minio1 minio2 minio3 minio4 的原因是因为您正在执行:docker-compose up [serviceName] [entrypoint] [parameter1] [parameter2]... 即,docker-compose 允许您仅执行 compose 文件中定义的服务,如果需要,可以使用其参数指定一个新入口点,但不能仅在一个命令中执行多个服务。

      【讨论】:

      • 这是不正确的,docker-compose up minio1 minio2 minio3 minio4 确实启动了这 4 个服务!见docker-compose up
      【解决方案3】:

      实际上,我在当前的项目中遇到了类似的挑战。这让我想到了编写一个小脚本,我称之为docker-compose-profile(或简称:dcp)。我昨天在 GitLab 上以docker-compose-profile 的身份发布了这篇文章。简而言之:我现在可以使用dcp -p all-minio "up -d" 之类的命令启动几个预定义的 docker-compose 配置文件。配置文件可能包含docker.compose.yml 中所有已定义服务的子集。使用这种机制,可以很容易地启动在dcp.yml 中单独定义的几组服务。为启动定义一些步骤,也可以首先启动所有 minio 服务,下一步将启动其他服务。 随意尝试并提供一些反馈或建议以进一步改进。

      因此可以涵盖两个场景:a)只启动你的 minio 东西 b)首先启动 minio 服务并继续使用其他服务。

      【讨论】:

      • 你可能想看看docs.docker.com/compose/profiles ;)
      • 感谢您的提示。但我的方法不仅仅是 docker-compose 配置文件。你读过我的自述文件吗?
      【解决方案4】:

      您是否确实检查过卷是否已创建?运行 docker-compose up minio1 minio2 minio3 minio4 将启动这些容器及其所有依赖项,例如 depends_on 容器和卷,但只会输出命令中明确列出的容器的日志。

      即卷实际上是创建的,但这只是没有记录到您,因为您只附加到容器的日志! (并且卷是由docker-compose 而非容器本身创建的)。

      我在真正的 docker-compose.yml 文件中有很多其他服务,我不想一直运行 docker-compose up 并启动​​每个服务。

      docker-compose 1.28.0 开始,新的service profiles 就是为此而生的!使用profiles,您可以将服务标记为仅在特定配置文件中启动:

      services:
        minio1:
          profiles: ["minio"]
          #...
      
        minio2:
          profiles: ["minio"]
          #...
      
        minio3:
          profiles: ["minio"]
          #...
      
        minio4:
          profiles: ["minio"]
          #...
      
        service1:
          profiles: ["other"]
          #...
      
        service2:
          profiles: ["other"]
          #...
      
        service3:
          profiles: ["other"]
          #...
      
        service4:
          profiles: ["other"]
          #...
      
      docker-compose up # start only your default services (without `profiles`)
      docker-compose --profile minio up # start default and minio services
      docker-compose --profile other up # start default and "other" services
      

      您也可以考虑将您的服务拆分为multiple docker-compose.yml files

      # only start services in docker-compose.minio.yml
      docker-compose -f docker-compose.minio.yml up
      
      # merge docker-compose.minio.yml with docker-compose.yml
      # and start all contained services
      docker-compose -f docker-compose.yml -f docker-compose.minio.yml up
      

      【讨论】: