Shell:检查docker容器是否存在

Shell:检查docker容器是否存在

如果出现这种情况,我该如何签入 bash 脚本

sudo docker images -q nginx

给我一个结果字符串,这意味着该容器已存在

sudo docker images -q nginx
if [ $? != '' ]
then
    echo "existing"
else
    echo "missing

答案1

我尝试了,按照“最佳答案”中的建议,但它只返回图像的 ID,而不是容器的 ID。无论容器是否正在运行,它总是返回Image ID。docker images -q "{Image Name}"

如果你想知道容器是否正在运行,你需要应用以下命令:

docker ps -q -f 名称=“{容器名称}

如果容器存在并且正在运行,则返回容器 ID。如果它不存在,或者存在但被停止,则返回一个空字符串。如果要搜索所有(正在运行和已停止)容器,请对“docker ps”命令使用“-a”参数,如下所示:

docker ps -a -q -f 名称=“{容器名称}

您还可以按其他字段搜索,例如按容器 ID 搜索:

docker ps -a -q -f id="{容器ID}

欲了解更多详情,请参阅官方“docker ps”文档

答案2

$?不是字符串,而是sudo(在本例中)的退出状态。要正确使用它,请将其与 0 进行比较-gt,或使用(在像或那样使用 进行算术评估的if (( $? ))shell 中)。bashksh93(( ... ))

如果sudo docker images -q nginx容器镜像存在则返回一个字符串,如果不存在则返回任何内容,那么您可以将其存储在变量中并查看它是否为空:

result=$( sudo docker images -q nginx )

if [[ -n "$result" ]]; then
  echo 'Container image exists'
else
  echo 'No such container image'
fi

但是,sudo在脚本内部使用很尴尬,因为该工具通常需要交互式提示输入密码,最好使用sudo它来运行脚本本身(然后sudo仅当您需要假设其他非 root 用户的身份时才在脚本内部使用) 。

docker inspect另一个用于检查容器信息的命令:

docker inspect -f '{{.Config.Image}}' nginx

这将给出容器的容器映像哈希nginx。它还会返回正确的退出状态,您可以使用它来确定容器是否存在:

if docker inspect -f '{{.Config.Image}}' nginx >/dev/null 2>&1
then
    echo 'Container image exists'
else
    echo 'Container does not exist'
fi

或者,您可以挑选输出字符串并查看它是否为空:

result=$( docker inspect -f '{{.Config.Image}}' nginx 2>/dev/null )

if [[ -n "$result" ]]; then
  echo 'Container image exists'
else
  echo 'No such container image'
fi

我通过将标准错误流重定向到来丢弃它,/dev/null因为如果容器映像不存在,它会抱怨。

您还可以docker inspect通过检查来确定容器是否正在运行{{.State.Running}}

result=$( docker inspect -f '{{.State.Running}}' nginx )

if [[ $result == "true" ]]; then
  echo 'Container is running'
else
  echo 'Container is not running'
fi

答案3

尝试这个

sudo docker inspect --format="{{.State.Running}}" $CONTAINER
# If the $CONTAINER is running or not and exists, $? is 0
# But If the $CONTAINER doesn't exist or was never created,
# $? is 1 on docker, or 125 on podman 
if [ $? -eq 0 ];
then
     echo "existing"
else
     echo "missing"
fi

相关内容