Bash脚本因错误而失败:OCI运行时执行失败

时间:2020-08-29 13:25:19

标签: bash docker shell scripting

我正在运行以下脚本并出现错误。

#!/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

有人可以帮助我解决该错误。任何帮助将不胜感激。

2 个答案:

答案 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运行它们,以便您可以明确标识它们。)