docker-compose 仅​​适用于某些容器

Posted

技术标签:

【中文标题】docker-compose 仅​​适用于某些容器【英文标题】:docker-compose up for only certain containers 【发布时间】:2015-07-25 19:40:43 【问题描述】:

我有一个docker-compose.yml,其中包含几个容器。其中三个用于我的应用程序(客户端、服务器和数据库),其余用于各种开发工具(例如 psql、npm、manage.py 等)。当我做docker-compose up时,它们都已启动,但我只希望三个主要的启动。由于我已经指定了链接,我可以只用docker-compose up client 开始这三个链接,但是输出只来自那个容器。那么,有没有办法做到以下几点:

    告诉 docker-compose 哪些容器应该由 docker-compose up 启动 从docker-compose up client 获取所有链接容器的输出

【问题讨论】:

根据文档:docker-compose up [options] [SERVICE...] 可让您启动您想列出的任何服务子集。 【参考方案1】:

更新

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

services:
  client:
    # ...
  db:
    # ...
  npm:
    profiles: ["cli-only"]
    # ...
docker-compose up # start main services, no npm
docker-compose run --rm npm # run npm service
docker-compose --profile cli-only up # start main and all "cli-only" services

原始答案

Since docker-compose v1.5 可以pass multiple docker-compose.yml files with the -f flag。这使您可以将您的开发工具拆分为单独的 docker-compose.yml,然后您只需按需添加:

# start and attach to all your essential services
docker-compose up

# execute a defined command in docker-compose.dev.yml
docker-compose -f docker-compose.dev.yml run npm update

# if your command depends_on a service you need to include both configs
docker-compose -f docker-compose.yml -f docker-compose.dev.yml run npm update

如需对此进行深入讨论,请参阅docker/compose#1896。

【讨论】:

非常有用!在docker-compose --profile cli-only 之后缺少一个“向上” 如果您至少有一个没有配置文件的服务,如果您运行--profile profile,那么该没有配置文件的服务也将运行。因此,您应该将profile 指令添加到您的所有服务中。 1.29.1【参考方案2】:

启动 docker-compose 文件中定义的特定服务。 例如,如果你有一个 docker-compose.yml

docker-compose start db  

给定一个 compose 文件,如下所示:

version: '3.3'

services:
   db:
     image: mysql:5.7
     ports:
       - "3306:3306"
     volumes:
       - ./db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: yourPassword
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: yourPassword

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "80:80"
     volumes:
       - ./l3html:/var/www/html
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: yourPassword
volumes:
    db_data:
    l3html:

有时您只想在启动整个套件之前启动 mySQL(有时您只想填充数据库)。

【讨论】:

为什么sudodocker-compose ... 之前?这没必要吧? 如果您的用户在 docker 组中没有,是的,这是必要的。 如果我使用sudo docker-compose up db 而不是sudo docker-compose start db 有什么区别 @LukAron - start 假设容器已经存在并启动它,up 将在必要时提取图像,在必要时创建容器,然后启动容器。【参考方案3】:

您可以使用run 命令并指定要运行的服务。请注意,运行命令不会向主机公开端口。如果需要,您应该使用标志 --service-ports 来执行此操作。

docker-compose run --service-ports client server database

【讨论】:

【参考方案4】:

实际上,我在当前的项目中遇到了非常相似的挑战。这让我想到了编写一个小脚本,我称之为 docker-compose-profile(或简称:dcp)。我今天在 GitLab 上以docker-compose-profile 发布了这篇文章。 简而言之:我现在可以使用dcp -p some-services "up -d" 之类的命令启动几个预定义的 docker-compose 配置文件。随意尝试并提供一些反馈或建议以进一步改进。

【讨论】:

【参考方案5】:

哦,就这个:

$ docker-compose up client server database

【讨论】:

【参考方案6】:

一个好的解决方案是只运行所需的服务,如下所示:

docker-compose up --build $(<services.txt)

services.txt 文件如下所示:

services1 services2, etc

当然如果是依赖(depends_on),需要一起运行相关服务。

--build 是可选的,例如。

【讨论】:

【参考方案7】:

您通常不想这样做。使用 Docker Compose,您可以定义 compose 应用程序的服务npmmanage.py 只是管理命令。你不需要为它们准备一个容器。如果您需要,比如说使用manage.py 创建您的数据库表,您所要做的就是:

docker-compose run client python manage.py create_db

将其视为 Heroku 使用的一次性测功机。

如果您确实需要将这些管理命令视为单独的容器(并且还为这些容器使用 Docker Compose),您可以创建一个单独的 .yml 文件并使用以下命令启动 Docker Compose:

docker-compose up -f my_custom_docker_compose.yml

【讨论】:

A lot of people 想要这样做。 @msrd0 你通常不想这样做吗?让人们自己决定! 应该有一条关于 SO 的规则,你不能在不解释原因的情况下投反对票。因为这(或至少第一部分)最有意义,所以为每个可能的管理命令添加一个额外的容器是非常奇怪的。 我想这样做:) 为什么?例如。在开发环境中,我将在容器中启动多个服务,另一个在外部 - 我目前正在处理的(为了更容易开发/调试)【参考方案8】:

您可以使用以下命令启动容器:

$ docker-compose up -d client

这将在后台运行容器,并且输出将来自

$ docker-compose logs

它将包含所有已启动的容器

【讨论】:

完美。如果您想看到日志回显到标准输出,只需删除 -d 标志 如果依赖容器已经在运行并且我不想重新启动它,是否可以启动依赖容器? 当心 docker-compose.yml 上的 depends_on 标志 这对我有帮助:docker-compose logs ,用于检测到容器中的错误

以上是关于docker-compose 仅​​适用于某些容器的主要内容,如果未能解决你的问题,请参考以下文章

仅适用于某些路线的角度通用渲染

jquery hover 仅适用于某些 div

Proguard:-keepparameternames 仅适用于某些包

jqGrid filterToolbar 仅适用于某些列

phpmyadmin 权限仅适用于某些数据库

如何使 DefaultValueHandling 仅适用于某些类或成员?