重复使用YAML部分

时间:2017-08-03 18:38:27

标签: yaml

我正在整理一个docker-compose文件。我想重复使用重复的部分。例如,每个容器重新使用相同的deploy配置。我试着为它制作一个模板:

  ...
  redis:
    image: redis
    ports:
      - 6379:6379
    deploy: deploy_template
    volumes:
      - /srv/redis/data:/data

deploy_template:
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 10
    window: 120s

然而这不起作用。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以有效地使用YAML锚点和别名设施:

version: '2'
dummy: &deploy_template
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 10
    window: 120s
services:
  redis:
    image: redis
    ports:
      - 6379:6379
    deploy: *deploy_template
    volumes:
      - /srv/redis/data:/data

将被解析为您已指定:

version: '2'
dummy:
  restart_policy:
    condition: on-failure
    delay: 5s
    max_attempts: 10
    window: 120s
services:
  redis:
    image: redis
    ports:
    - 6379:6379
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 10
        window: 120s
    volumes:
    - /srv/redis/data:/data

您可以为单个*deploy_template锚点设置多个&deploy_template值。

然而问题是dummy密钥及其值将跳转docker-compose,至少在版本2中没有放置此信息的地方。

因此,我使用ruamel.dcw(我是该软件包的作者)预处理我的docker-compose文件,该文件允许user-data顶级密钥不会出现在输出中你可以在哪里放置这样的锚信息。从:

开始
version: '2'
user-data:
  author: dthree <calvin@hobbes.org>
  description: redis container
  env-defaults:
    NAME: redis  # default values if not specified in the environment
    PORT: 6379
  dummy: 
  - &deploy_template
    restart_policy:
      condition: on-failure
      delay: 5s
      max_attempts: 10
      window: 120s
  - &some_other_template:
    x: null
services:
  redis:
    image: ${NAME}
    ports:
      - "${PORT}:${PORT}"
    deploy: *deploy_template
    volumes:
      - /srv/${NAME}/data:/data

这将扩展为:

version: '2'
services:
  redis:
    image: ${NAME}
    ports:
    - ${PORT}:${PORT}
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 10
        window: 120s
    volumes:
    - /srv/${NAME}/data:/data

在交给docker-compose之前(使用-f选项)。 env-defaults“部分中尚未在执行预处理器的环境中设置的任何变量将被赋予其默认值,从而可以轻松覆盖它们。

顺便说一句:你应该小心:

 - 6379:6379

因为如果端口号低于60,则docker-compose使用的旧YAML解析器将该标量解释为sexagesimal。我倾向于总是引用这些值,特别是在使用env时。变量