【问题标题】:Hidden reusable blocks in YAMLYAML 中隐藏的可重用块
【发布时间】:2017-12-07 20:54:36
【问题描述】:

我正在尝试在 docker-compose.yml 文件中定义可重用块,使可重用块定义本身不包含在最终(评估的)YAML 中。

我知道如何用这种语法定义一个可重用的块:

services:
  default: &default
    image: some/image

  dashboard:
    <<: *default
    command: run dashboard
    ports: ["3000:3000"]

但是,上面还在服务下创建了一个名为default 的条目,我想避免这种情况。换句话说,我需要最终的 YAML 结果只在 services 属性下包含 dashboard

这可以用 YAML 实现吗?我找不到任何足够清楚地讨论此结构的参考资料。

直觉上,我尝试了以下的一些变体,但也没有奏效。

services:
  &default:
    image: some/image

  dashboard:
    <<: *default
    command: run dashboard
    ports: ["3000:3000"]

【问题讨论】:

  • 我刚刚用实用程序 dcw (docker-compose-wrapper) 包装了 docker-compose,它会生成一个新的(隐藏的)YAML 文件,然后在该文件上调用 docker-compose。 (ruamel.dcw)。它有一个顶级密钥user-data,它不会被复制到隐藏文件中。您需要通过在 RoundTripLoad 构造函数上使用 SafeLoad flatten_mapping 来防止合并在往返过程中un扩展。
  • 这是很好的附加信息,但感觉像是过度包装的东西。毕竟,docker-compose 是一种包装器......
  • 当我做这个时,我需要一种更简单的方法来为缺失的环境设置默认值,并且能够在不同服务器和不同环境 (systemd/updstart) 上启动时自动覆盖信息。使用模板很容易做到,它就像docker-compose 一样,带有一些额外的命令(当前为bashexpandgeneratetemplatestruncate
  • 我不想建议这个,但您可以定义 1 个或多个基于 busybox 的服务,其中 0 个副本具有您的别名。然后在需要的地方使用这些引用。

标签: yaml docker-compose


【解决方案1】:

这在 YAML 1.2(或任何以前的版本)中是不可能的。这背后的原因是 YAML 被设计为一种序列化语言,而不是一种配置语言。

Anchor/Alias 结构非常适合序列化循环数据结构。它从未打算用于声明将在多个地方使用的变量。因此,目前,创建可在多个地方使用的可重用结构的唯一方法是在使用它的第一个地方定义结构。例如:

services:
  dashboard:
    <<: &default
      image: some/image
    command: run dashboard
    ports: ["3000:3000"]
  some_other_service:
    <<: *default
    other_props: ...

另外,请注意合并键 &lt;&lt; 不是 YAML 规范的一部分,仅定义为 YAML 1.1 的附加功能。它没有为 YAML 1.2 定义,将在即将推出的 YAML 1.3 中明确弃用。

我们(例如:目前从事 YAML 1.3 工作的人)已经意识到这个缺失的功能,并计划为 YAML 1.3 提供更好的解决方案。

【讨论】:

  • 非常感谢您提供的信息。至少很高兴知道它绝对不可能。如果合并键不是“官方的”并且将被弃用,那么合并此类锚点的官方方法是什么?我看到的所有示例都使用这种表示法,甚至 Rails 的database.yml 文件也带有这种类型的配置。
  • 从 YAML 1.2 开始,没有任何官方方法可以进行任何数据转换操作,因为 YAML 不是数据转换语言。随着我们适应 YAML 主要用作配置语言这一事实​​,这将随着 YAML 1.3 的变化而改变,人们可能希望拥有这种转换能力。
  • @flyx 我浏览了为 YAML 1.3 提出的所有 RFC,但仍然找不到对此类功能的任何支持。我错过了什么吗?
  • @lz96 我最初的建议是here,概念验证实现是here。我实验的主要结果是,虽然可以添加转换,但在 YAML 1.3 中真正包含它太复杂了,因为大多数实现可能不会实现它。
【解决方案2】:

Docker Compose 文件格式 3.4 添加了对扩展字段的支持:以 x- 开头的顶级键被 Docker Compose 和 Docker 引擎忽略。

例如:

version: '3.4'
x-default: &default
  image: some/image
services:
  dashboard:
    <<: *default
    command: run dashboard
    ports: ["3000:3000"]

来源:King Chung Huang https://link.medium.com/N5DFdiC3F0 的“不要在 Docker Compose 文件中重复使用锚点、别名和扩展名”

【讨论】:

  • 对这个主题的贡献很好,谢谢。虽然不是通用的 YAML 解决方案,但在使用 docker-compose 时绝对可以派上用场。如果答案包含一个最小示例,这将很有帮助,以避免依赖外部链接获取更多详细信息。
猜你喜欢
  • 2015-09-24
  • 2014-12-28
  • 2019-04-11
  • 2012-01-17
  • 2013-11-17
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多