首页 > 解决方案 > sh/sed 从文件中删除行以进行 docker-compose 卷覆盖

问题描述

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

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

标签: regexseddocker-composesh

解决方案


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(true),如果该行的第一个字段是volumes:,否则为0(false)。然后对于每一行,我们只检查inVol它是否为真(即我们正在处理以开头的行volume:-在下一行之前开始的后续行,而不是以 开头-)然后!inVol是假的,所以我们什么也不做,但是如果inVol为假(即我们不在volume:块中)!inVol则为真,因此我们调用默认操作给定一个真条件,即打印当前行。


推荐阅读