【问题标题】:sh/sed to delete lines from file for docker-compose volume overridesh/sed 从文件中删除行以进行 docker-compose 卷覆盖
【发布时间】:2019-02-05 18:56:02
【问题描述】:

docker-compose 允许覆盖文件,但是如果在第一个文件中指定了卷,例如 volA,并且在覆盖 volB 中指定了卷,则最终结果将是 volA 和 @987654324 @。

我需要编写一个脚本来搜索和删除初始 docker-compose 文件中的所有卷。

这个docker-compose.yaml

version: '2'
services:
  first-container:
    image: 'alpine'
    ports:
      - '5000'
    volumes:
      - './volA:/etc/volA'
      - './volB:/etc/volB'
  second-container:
    image: 'alpine'
    ports:
      - '5000'
    volumes:
      - './volC:/etc/volC'
      - './volD:/etc/volD'

运行script,使docker-compose.yaml文件变为:

version: '2'
services:
  first-container:
    image: 'alpine'
    ports:
      - '5000'
  second-container:
    image: 'alpine'
    ports:
      - '5000'

我知道我必须按照这个思路做点什么,但我不太确定该怎么做。

sed -i '/volume:/d' '' ./docker-compose.yaml

【问题讨论】:

    标签: regex sed docker-compose sh


    【解决方案1】:

    sed 用于做 s/old/new,仅此而已。对于其他任何事情,请使用 awk:

    $ awk '$1!="-"{inVol=($1=="volumes:")} !inVol' file
    version: '2'
    services:
      first-container:
        image: 'alpine'
        ports:
          - '5000'
      second-container:
        image: 'alpine'
        ports:
          - '5000'
    

    在 cmets 中要求的解释:每次输入行不以 - 开头时,如果该行的第一个字段是 volumes: 或 @,我们将变量 inVol 设置为 1 (true) 987654326@ (false) 否则。然后对于每一行,我们只检查inVol 是否为真(即,我们正在处理以volume: 开头的行或以- 开头的后续行,然后是下一行不以@ 开头的行987654330@) 那么!inVol 为假,所以我们什么也不做,但如果inVol 为假(即我们不在volume: 块中),那么!inVol 为真,那么我们调用给定的默认操作一个真正的条件,即打印当前行。

    【讨论】:

    • 天哪,太有帮助了!!你能帮我理解它是如何工作的吗?我真的很感激!
    • 我在答案中添加了解释。
    • 感谢 Ed,这非常有帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2018-01-12
    相关资源
    最近更新 更多