Docker: 使用多个 YAML 文件时删除设置

Docker: remove a setting when using multiple YAML files

使用 Docker Swarm,我将所有 "overrides" 保存在一个 yml 文件中,如下所示:

docker stack -c base.yml -c overrides.yml deploy myStack

如果我的 base.yml 文件为 serviceA 定义了这些部署限制:

serviceA:
  . . .
  deploy:
    resources:
      limits: {memory: 1024M}
      reservations: {memory: 1024M}

我可以轻松覆盖 overrides.yml:

serviceA:
  deploy:
    resources:
      limits: {memory: 2048M}
      reservations: {memory: 2048M}

这样,我的 base.yml 可以随着产品新版本的发布而改变,但是任何覆盖都可以很容易地从旧版本转移到新版本。但是,如果我想移除或删除 base.yml 中定义的内容怎么办?如果我想保留 reservation,但使用第二个 yml 文件删除 limits 定义。有什么办法吗?目前,我使用的是 yaml 版本 3.6。

这两个选项不起作用。这(不可解析):

serviceA:
  deploy:
    resources:
      limits: {memory: }
      reservations: {memory: 2048M}

和这个(使用 base.yml 中定义的默认值):

serviceA:
  deploy:
    resources:
      reservations: {memory: 2048M}

当使用多个 docker-compose 文件时,后面的文件会合并到前面的文件中。这意味着:您不能删除定义,只能修改现有定义或添加新定义(请参阅 https://github.com/docker/compose/issues/3729). A PR 以允许在不合并的情况下创建和关闭定义。

因此,剩下的就是从 base.yml 中删除 limits 定义,仅将其包含在 overrides.yml.

fjc 为我的问题提供了实际答案。对于我感兴趣的特定情况,我了解到如果您 'override' 并将内存限制设置为零 (0),则相当于根本没有设置它。不是一般的解决方法,但至少是针对此特定案例的解决方法。例如:

serviceA:
  deploy:
    resources:
      limits: { cpus: '0', memory: '0' }

实际上不会限制 CPU 或内存的数量。