我正在使用@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
论证运行良好。
--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 版本包含。