在Jenkins机器上,我想创建一个指定名称的Docker容器,但仅当它不存在时(在shell脚本中)。我认为可以运行创建容器的命令,并忽略失败(如果有的话),但这会导致我的Jenkins作业失败。
因此,我想知道如何使用bash检查Docker容器是否存在。
因此,我想知道如何使用bash检查Docker容器是否存在。
您可以通过搜索 <name>
来检查未运行的容器是否存在,然后稍后像这样启动它:
[ ! "$(docker ps -a | grep <name>)" ] && docker run -d --name <name> <image>
更好的方式:
利用https://docs.docker.com/engine/reference/commandline/ps/命令检查已退出的容器是否阻塞,以便在运行容器之前先将其删除:
if [ ! "$(docker ps -a -q -f name=<name>)" ]; then
if [ "$(docker ps -aq -f status=exited -f name=<name>)" ]; then
# cleanup
docker rm <name>
fi
# run your container
docker run -d --name <name> my-docker-image
fi
我想
docker container inspect <container-name> || docker run...
由于 Docker 容器检查调用会在容器不存在时将 $? 设置为 1(不能检查),但在容器存在时将其设置为 0(这尊重停止的容器)。因此,如果容器不存在,run 命令将会按预期被调用。
docker container inspect <容器名称> > /dev/null 2>&1
命令来丢弃成功和失败的输出。 - Mikhail Vasin您可以使用 docker ps
命令的 filter
和 format
选项,避免与类Unix工具(如 grep
, awk
等)一起使用管道。
name='nginx'
[[ $(docker ps --filter "name=^/$name$" --format '{{.Names}}') == $name ]] ||
docker run -d --name mynginx <nginx-image>
--filter "name=^/$name$"
来获得精确匹配。 - bcoughlan$
的作用是将 name
替换为名为 name
的 shell 变量的值。这个变量在之前被定义过。"name=^/$name$"
相当于 "name=^/${name}$"
(个人认为后者更易读)。 - fstamourCONTAINER_NAME='mycontainername'
CID=$(docker ps -q -f status=running -f name=^/${CONTAINER_NAME}$)
if [ ! "${CID}" ]; then
echo "Container doesn't exist"
fi
unset CID
使用 docker top 命令可以更加简洁:
docker top <name> || docker run --name <name> <image>
docker top
返回非零值当没有匹配名称的容器运行时,否则它返回进程ID、用户、运行时间和命令。
不带未记录行为的强大grep ^$
这是我能找到的最精确和灵活的方法:
container_name=mycont
if sudo docker ps -a --format '{{.Names}}' | grep -Eq "^${container_name}\$"; then
echo exists
else
echo 'does not exist'
fi
背景:
docker container inspect
的退出状态和 -f name
接受某种形式的正则表达式。Python
这里提供了Python版本,以便于在项目中使用:
containers = subprocess.check_output([
'sudo',
'docker',
'ps',
'-a',
'--format', '{{.Names}}',
]).decode()
if container_name in containers.split():
# Exists.
CNAME=$CONTAINER_NAME-$CODE_VERSION
if [ "$(docker ps -qa -f name=$CNAME)" ]; then
echo ":: Found container - $CNAME"
if [ "$(docker ps -q -f name=$CNAME)" ]; then
echo ":: Stopping running container - $CNAME"
docker stop $CNAME;
fi
echo ":: Removing stopped container - $CNAME"
docker rm $CNAME;
fi
docker ps
显示正在运行的容器。docker ps -q
也是如此,但输出内容只包括容器ID。docker ps -a
列出所有容器(无论是否在运行中)。docker ps -qa
是所有容器的简单列表,而docker ps -q
是正在运行的容器的简单列表。docker ps -q -f name=ContainerName
是具有名称 ContainerName 的正在运行的容器的简单列表。docker ps -qa -f
将包括已退出的容器,因此逻辑必须检查 -a(包括所有容器,无论是否在运行状态),然后再没有 -a,以查看它不仅仅存在,而且正在运行(需要先停止)。我使用以下代码来确定是否存在Docker容器:
CONTAINER_NAME='my_docker_container'
# Checking if docker container with $CONTAINER_NAME name exists.
COUNT=$(docker ps -a | grep "$CONTAINER_NAME" | wc -l)
if (($COUNT > 0)); then
echo 'container exists'
fi
ps -a
的其他字段匹配失败,并且您不需要wc
,则可以直接使用grep状态。我的版本没有这些问题:https://dev59.com/_lkT5IYBdhLWcg3wc_JR#50841982 - Ciro Santilli OurBigBook.com-a
如果你想列出所有状态(停止、运行等)
-f status=running
(如果只想列出正在运行的容器,则不需要)
$ docker ps -f name=containerName | grep containerName
$ echo %errorlevel%
Linux
$ echo $?
Ref: https://www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/
(docker ps -a --format {{.Names}} | grep container_name -w) && echo Exists || echo "Doesn't exist"
-a
参数,否则尝试运行一个已退出的容器将会失败。 - ldgdocker ps -aq -f name=^name$
只匹配完全相同的名称。 - Olix