如果出现这种情况,我该如何签入 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 中)。bash
ksh93
(( ... ))
如果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