我有一个docker-compose
文件,其中有一个带有版本标记的docker图像,例如myrepo.com/myimage:1.0.1.0
。我想编写一个bash脚本,该脚本接收版本号作为参数并更新相关图像的版本标签。
目前,我正在使用以下命令在grep
和sed
的帮助下替换版本标记,但我认为应该有一种更有效的方法。有什么建议么?
sedval='1.1.1.1' # <-- new value
imageval=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml | cut -d ':' -f2,3)
imagename=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml | cut -d ':' -f2)
imageversion=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml | cut -d ':' -f3)
sed -i -e "s+$imageval+$imagename:$sedval+g" docker-compose.yml
最佳答案
通常不建议使用面向行的正则表达式工具来操作YAML。为此,您可能应该切换到支持YAML的工具,例如yq
。
似乎没有理由提取imageversion
;您分配了此变量,但从不使用它。实际上,如果您放弃区分大小写的匹配要求,那么您真正需要的就是
sed -i "s+\\(image: myrepo\\.com/myimage:\\)[.0-9]*+\\1$1+" docker-compose.yml
假设(就像您在问题中说的那样)新版本号位于
$1
中,这是脚本的第一个命令行参数。我不认为Docker允许您使用大写字母。如果可以,则可以将
i
替换为[Ii]
,将m
替换为[Mm]
,等等。请注意,严格来说,还需要对文字点进行反斜杠转义。一般来说,您通常可以将
grep 'x' | sed 'y'
替换为sed '/x/y'
;另请参阅useless use of grep
.另外,重复的grep
可以很容易地重新修饰成单个grep
,例如imageval=$(grep -i 'image: myrepo.com/myimage:' docker-compose.yml)
imagever=${imageval##*:}
imagename=${imageval%:$imagever}
在此非常简单的字符串提取任务中,与在单独的过程中反复生成
cut
相比,shell参数替换既简单又优雅,并且效率更高。
关于bash - 使用bash脚本更新文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59190198/