使用通配符和单个命令删除 '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')
这会做三件事:
- 运行
docker config ls
,生成其格式化输出。
- 过滤器 (
grep
) 仅输出包含 app1...-1.2.2
. 的行
- 将生成的输出(拆分为单词)作为参数传递给
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 答案中很难解释。)
我目前正在处理 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')
这会做三件事:
- 运行
docker config ls
,生成其格式化输出。 - 过滤器 (
grep
) 仅输出包含app1...-1.2.2
. 的行
- 将生成的输出(拆分为单词)作为参数传递给
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 答案中很难解释。)