docker-compose允许覆盖文件,但是如果在第一个文件中指定了卷,例如volA
,并且在覆盖volB
中指定了卷,则最终结果将是volA
和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
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'
注释中要求的解释:每次输入行不以-
开头时,如果行上的第一个字段是inVol
或1
(false),我们将变量volumes:
设置为0
(true)。然后对于每一行,我们只检查inVol
,如果它是真的(即我们正在处理以volume:
开始的行或后续行以-
开始的下一行之前没有以-
开头的那一行)那么!inVol
是假的,所以我们什么都不做,但是如果inVol
是假的(即我们不在volume:
块中)那么!inVol
是真的那么我们调用默认动作给定一个真实条件,即打印当前行。