sh / sed从文件中删除docker-compose音量覆盖的行

问题描述 投票:0回答:1

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

我需要编写一个脚本来搜索和删除初始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个回答
2
投票

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'

注释中要求的解释:每次输入行不以-开头时,如果行上的第一个字段是inVol1(false),我们将变量volumes:设置为0(true)。然后对于每一行,我们只检查inVol,如果它是真的(即我们正在处理以volume:开始的行或后续行以-开始的下一行之前没有以-开头的那一行)那么!inVol是假的,所以我们什么都不做,但是如果inVol是假的(即我们不在volume:块中)那么!inVol是真的那么我们调用默认动作给定一个真实条件,即打印当前行。

© www.soinside.com 2019 - 2024. All rights reserved.