我正在运行以下脚本并出现错误。
#!/bin/bash
webproxy=$(sudo docker ps -a --format "{{.Names}}"|grep webproxy)
webproxycheck="curl -k -s https://localhost:\${nginx_https_port}/HealthCheckService"
if [ -n "$webproxy" ] ; then
sudo docker exec $webproxy sh -c "$webproxycheck"
fi
这是我的docker ps -a
输出
$sudo docker ps -a --format "{{.Names}}"|grep webproxy
webproxy-dev-01
webproxy-dev2-01
当我单独运行命令时,它可以工作。例如:
$sudo docker exec webproxy-dev-01 sh -c 'curl -k -s https://localhost:${nginx_https_port}/HealthCheckService'
HEALTHCHECK_OK
$sudo docker exec webproxy-dev2-01 sh -c 'curl -k -s https://localhost:${nginx_https_port}/HealthCheckService'
HEALTHCHECK_OK
这是我得到的错误。
$ sh healthcheck.sh
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"webproxy-dev-01\": executable file not found in $PATH": unknown
有人可以帮助我解决该错误。任何帮助将不胜感激。
答案 0 :(得分:0)
根据给定的脚本,您尝试“执行”以下内容
sudo docker exec webproxy-dev2-01
webproxy-dev-01 sh -c "curl -k -s https://localhost:${nginx_https_port}/HealthCheckService"
如您所见,这是您的错误。
sudo docker exec webproxy-dev2-01 webproxy-dev-01 [...]
问题是此行:
webproxy=$(sudo docker ps -a --format "{{.Names}}"|grep webproxy)
这将导致以下结果(您也发布了此信息):
webproxy-dev2-01
webproxy-dev-01
现在,问题在于,您的docker exec
命令现在同时获取两个图像名称(来自变量赋值$webproxy
),解释第二个条目(webproxy-dev-01
,并用\n
)作为exec命令。现在,这已成为给定的命令,它无效且无法找到:这就是错误告诉您的内容。
一种解决方法如下:
webproxy=$(sudo docker ps -a --format "{{.Names}}"| grep webproxy | head -n 1)
它只会抓取输出的第一项。您当然可以修改它以循环执行此操作。
一个小片段:
#!/bin/bash
webproxy=$(sudo docker ps -a --format "{{.Names}}"| grep webproxy )
echo ${webproxy}
webproxycheck="curl -k -s https://localhost:\${nginx_https_port}/HealthCheckService"
while IFS= read -r line; do
if [ -n "$line" ] ; then
echo "sudo docker exec ${line} sh -c \"${webproxycheck}\""
fi
done <<< "$webproxy"
答案 1 :(得分:0)
因为该变量包含两个标记(分别在两行上),所以该变量扩展为该标记。您正在跑步
sudo docker exec webproxy-dev-01 webproxy-dev2-01 ...
那当然是错误。
目前尚不清楚您实际上期望发生什么,但是如果您想遍历这些值,那就是
for host in $webproxy; do
sudo docker exec "$host" sh -c "$webproxycheck"
done
如果变量为空,它将方便地循环零次。
如果只需要一个值,则可以在管道中添加head -n 1
,或将更具体的正则表达式传递给grep
,使其仅匹配一个容器。 (如果您可以控制这些容器,则可以使用--name
运行它们,以便您可以明确标识它们。)