使用通配符和单个命令删除“旧的” Docker配置文件

时间:2018-12-28 12:46:29

标签: docker docker-swarm

我目前正在使用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的正确方法是什么?

谢谢

1 个答案:

答案 0 :(得分:0)

写作时

docker config rm $(docker config ls | grep -e 'app1'.*'-1.2.2')

这可以做三件事:

  1. 运行docker config ls,产生其格式化输出。
  2. 过滤器(grep)仅输出到包含app1...-1.2.2的行。
  3. 将生成的输出(分成单词)作为参数传递给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答案中很难解释。)