docker 如何从yaml配置中删除继承属性?

p8h8hvxi  于 2023-01-25  发布在  Docker
关注(0)|答案(2)|浏览(134)

我有一个像这样的yaml文件:

local: &local
  image: xxx
  # *tons of config*

ci:
  <<: *local
  image: # delete
  build: .

我希望ci继承local的所有值,除了image
是否有办法“删除”此值?

nsc4cvqm

nsc4cvqm1#

没有办法在YAML文件中将key标记为删除。您只能使用overwrite existing values
后者是你要做的,你把空标量作为值关联到键image,就像你写的那样:

image: null   # delete

您可以做两件事:后处理或在YAML文件中进行基本Map。
如果你想进行后处理,你可以给image或者一个特殊标记的对象关联一个特殊的唯一值,然后在加载后递归遍历树,删除带有这个特殊值的键值对。你是否已经可以在解析过程中使用钩子或者覆盖它的一些方法,取决于解析器。
使用基本Map需要的工作较少,但对YAML文件的干扰较大:

localbase: &lb
  # *tons of config*

local: &local
  image: xxx

ci:
  <<: *lb
  build: .

如果你做前者,你应该注意到如果你使用一个在往返过程中保留“合并层次结构”的解析器(就像我的ruamel.yaml解析器可以做的那样),仅仅删除键值对是不够的,在这种情况下,来自local的原始键值对会回来。

g52tjvyc

g52tjvyc2#

对于接受值列表的属性,可以将[]作为值发送。
例如,在docker-compose中,你不想继承ports

service_1:  &service_1
    # some other properties.
    ports:
      - "49281:22"
      - "8876:8000"
    # some other properties

    image: some_image:latest

service_2:
    <<: *service_1
    ports: []  # it removes ports values.
    image: null  # it removes image value.

相关问题