xargs 无法识别 docker 命令脚本中的 --verbose 选项

问题描述 投票:0回答:1

我正在使用@Krzysztof在基于健康检查重新启动不健康的docker容器中提出的解决方案。 我对原始版本进行了一项更改,添加了

--verbose
,以便命令
docker restart <ID>
将转到 docker log 驱动程序。

虽然

--verbose
在我的主机上的 CLI 中运行良好,但当由
unhealthy_container_restarter
容器运行时,相同的参数会被拒绝。

例如docker容器:

    unhealthy_container_restarter:
        image: docker:cli
        network_mode: none
        cap_drop:
           - ALL
        volumes: [ "/var/run/docker.sock:/var/run/docker.sock" ]
        command: [ "/bin/sh", "-c", "while true; do sleep 60; docker ps -q -f health=unhealthy | xargs --verbose --no-run-if-empty docker restart; done" ]
        restart: unless-stopped

当有另一个不健康的容器需要重新启动时,会导致此错误输出:

{"line":"xargs: unrecognized option: verbose","source":"stderr",.......}

此命令具有相同的语法,可交互运行:

$ sudo docker ps -q -f name=xxxx$ | xargs --verbose --no-run-if-empty sudo docker restart;

sudo docker restart ab14c1cxxxx9
ab14c1cxxxx9

在这种情况下

--verbose
有什么特别之处吗?
--no-run-if-empty
论证运行良好。

docker xargs
1个回答
1
投票

--verbose
不是 POSIX 标准 xargs(1) 中定义的选项。 如果您的运行时环境是 Alpine 容器或其他基于 BusyBox 或 BSD 工具的环境,它可能无法识别此选项。

GNU findutils 文档 指出,长格式

--verbose
与短格式
-t
相同,后者 is 是标准选项。 同样,
--no-run-if-empty
具有缩写形式
-r
,在(当前)POSIX xargs(1) 中。

如果您使用简短的选项,例如

,这更有可能起作用
docker ps -q -f health=unhealthy | xargs -t -r docker restart

BusyBox xargs(1)(将在 Alpine 容器中使用)也支持这两个选项。 2018 版本的 POSIX.1 不包括

-r
,但 2024 版本包含。

© www.soinside.com 2019 - 2024. All rights reserved.