使用通配符和单个命令删除 'old' docker 配置文件

Remove 'old' docker config files with wildcards and a single command

我目前正在处理 docker 配置文件,我正在寻找一种自动删除 'old' 配置文件的方法。我使用一个脚本,它将用 +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' 是我要删除的版本。

上面的命令 确实 删除了正确的配置,但它也会尝试删除以下 'configs'

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 配置 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 的正确方法是什么?

谢谢

写的时候

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

这会做三件事:

  1. 运行 docker config ls,生成其格式化输出。
  2. 过滤器 (grep) 仅输出包含 app1...-1.2.2.
  3. 的行
  4. 将生成的输出(拆分为单词)作为参数传递给 docker config rm

... | grep 调用是 "dumb",因为它不知道任何关于它所拥有的输入的特别信息,它只知道它是文本行并且它应该尝试过滤它。

此处更好的选择是更直接地告诉 docker config ls 您要查找的内容。 That command 采用 --filter 选项;这有点文档不足,但如果你知道配置对象的确切名称,你可以将它与 --quiet 结合起来告诉 Docker(而不是 shell)首先过滤到特定的配置对象然后只打印出它的ID。

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

"shellier"方法是使用另一种工具来清理格式化输出。 examples in the Docker documentation 将配置 ID 显示为第一个以空格分隔的列,因此您可以使用 awk(1) like

docker config ls | \
grep 'app1.*-1.2.2' | \
awk '{ print  }' \
xargs docker config rm

(其他工具在这里也能正常工作;我个人会使用 sed(1),但在 SO 答案中很难解释。)