我目前正在使用docker配置文件,并且正在寻找一种自动删除“旧”配置文件的方法。我使用的脚本会用+1更新所有配置文件版本;
app1-config-file-1.2.1
app1-config-file-1.2.2
app1-config-file-1.2.3
等
现在,我想在创建app1-config-file-1.2.3时删除app1-config-file-1.2.2。
这个命令使我有点接近;
docker config rm $(docker config ls | grep -e 'app1'.*'-1.2.2')
其中“ app1”是前缀,“-1.2.2”是我要删除的版本。
问题在于,上面的命令确实删除了正确的配置,但它也会尝试删除以下“配置”
Error response from daemon: access denied
Error: No such config: hours
Error: No such config: ago
Error response from daemon: access denied
Error: No such config: hours
Error: No such config: ago
我的查询返回了什么: $(docker config ls | grep -e'app1'。*'-1.2.2')
我尝试添加--quiet或-q仅返回配置ID。但是由于某些原因,我无法将其与容器一起使用的配置文件一起使用。
docker config ls -q | grep -e 'app1'.*'-1.2.2'
没有任何结果。
docker config ls | grep -e 'app1'.*'-1.2.2'
产生一个包含ID,配置文件名称,使用期限等的列表。基本上所有我想删除的配置文件,但我只需要ID
所以我的问题是 使用通配符时获取特定docker配置文件ID的正确方法是什么?
谢谢
答案 0 :(得分:0)
写作时
docker config rm $(docker config ls | grep -e 'app1'.*'-1.2.2')
这可以做三件事:
docker config ls
,产生其格式化输出。grep
)仅输出到包含app1...-1.2.2
的行。docker config rm
。 ... | grep
调用是“愚蠢的”,即它对所拥有的输入一无所知,只是知道它是文本行,因此应尝试对其进行过滤。
这里更好的选择是直接告诉docker config ls
您在寻找什么。 That command采用了--filter
选项;记录的文件很少,但是如果您知道配置对象的确切名称,则可以将其与--quiet
结合使用,以告诉Docker(不是shell)首先过滤到特定的配置对象,然后仅打印其ID。< / p>
docker config rm $(docker config ls -f name=app1-config-file-1.2.2 -q)
# But really this is the same as
docker config rm app1-config-file-1.2.2
“更复杂”的方法是使用另一个工具来清理格式化的输出。 examples in the Docker documentation将配置ID显示为第一个空格分隔的列,因此您可以像
这样使用 awk (1)
docker config ls | \
grep 'app1.*-1.2.2' | \
awk '{ print $1 }' \
xargs docker config rm
(其他工具在这里也能正常工作;我个人会使用 sed (1),但在SO答案中很难解释。)