【问题标题】:Remove 'old' docker config files with wildcards and a single command使用通配符和单个命令删除“旧”docker 配置文件
【发布时间】:2018-12-28 21:05:45
【问题描述】:

我目前正在使用 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”是我要删除的版本。

问题是上面的命令确实删除了正确的配置,但它也会尝试删除下面的'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 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 的正确方法是什么?

谢谢

【问题讨论】:

    标签: docker docker-swarm


    【解决方案1】:

    当你写作时

    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。

    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) 之类的

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

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

    【讨论】:

    • 感谢@David Maze。您的解决方案没有立即奏效。但我能够看到我必须做什么。现在使用 bashscript 修复它,该 bashscript 将执行部署删除旧配置版本:OLDCONFIG=$(docker config ls | grep -e ${STACKNAME}.*${CURRENTVERSION} | awk '{ print $1}')docker config rm $OLDCONFIG
    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2018-12-28
    • 2014-03-18
    • 1970-01-01
    • 2017-09-25
    • 2022-10-14
    相关资源
    最近更新 更多