gpt4 book ai didi

docker 组成 : run several containers that only differ in their command

转载 作者:行者123 更新时间:2023-12-05 08:46:23 24 4
gpt4 key购买 nike

我有一个 docker-compose.override.yml 文件,它启动 10 个不同的服务,这些服务仅在容器名称和它们运行的​​命令上有所不同。他们还需要各种环境变量、几个卷等。

文件看起来像这样,但它有 10 个部分,每个部分实际上有更多的配置。

我不喜欢所有的重复。

有没有办法将所有公共(public)配置部分移动到其他地方,让所有服务使用这些信息?

也许有其他解决方案?

version: "3"
services:
service-1:
image: my-image
tty: true
environment:
- APP_ENVIRONMENT=dev
working_dir: /source
volumes:
- .:/source:ro
command: run_services_1

service-2:
image: my-image
tty: true
environment:
- APP_ENVIRONMENT=dev
working_dir: /source
volumes:
- .:/source:ro
command: run_services_2

最佳答案

通过使用 YAML anchors and aliases 可以轻松地重用 docker-compose 文件中的代码块。功能。

例如:

services:
service1: &default
image: alpine
environment:
APP_ENVIRONMENT: dev
command: env

service2:
<<: *default
command: echo some other command

service3:
<<: *default
environment:
APP_ENVIRONMENT: prod

对于更高级的情况,您还可以使用这两个技巧:

  1. 仅将配置 block 的一部分标记为属于&default 或其他标记。
  2. 定义多个标记,并在部分之间创建一种继承。

以下是这两个功能的简单示例:

services:
bash:
build: .

# Only the below will be used for anyone inheriting from &default
<<: &default
image: me/my-image
environment:
APPENV: dev

web: &web
# Inherit from default
<<: *default
command: env

prod:
# Inherit from web
<<: *web
environment:
APPENV: production

您可以将其与仅包含 FROM alpine 或类似内容的简单 Dockerfile 一起尝试。

最后值得一提的是docker-compose支持隐藏配置 block ,他们称之为Extension Fields .任何以 x- 开头的内容都会被忽略,因此这可以用来定义模板,例如:

x-service: &service
depends_on: [nginx]
restart: always

services:
service1:
<<: *service
command: ...

service2:
<<: *service
command: ...
image: ...

附带提示:除非您有特定原因,否则请从您的文件中删除 version: 3。新的 docker compose 不再需要它。

关于 docker 组成 : run several containers that only differ in their command,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69824268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com