在Jenkins机器上,我只想创建一个具有指定名称的docker容器(如果它不存在)(在shell脚本中)。我以为我可能会运行该命令来创建容器,而忽略存在该容器的失败,但这会导致我的詹金斯工作失败。
因此,我想知道如何检查bash是否存在docker容器。
Answers:
您可以通过grepping a检查是否存在正在运行的容器,<name>
然后像下面这样启动它:
[ ! "$(docker ps -a | grep <name>)" ] && docker run -d --name <name> <image>
更好:
利用https://docs.docker.com/engine/reference/commandline/ps/并检查是否存在退出的容器,因此您可以在运行容器之前先将其删除:
if [ ! "$(docker ps -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
您可以使用filter
和format
查看选项docker ps
命令,以避免管道与UNIX工具一样grep
,awk
等等。
name='nginx'
[[ $(docker ps --filter "name=^/$name$" --format '{{.Names}}') == $name ]] ||
docker run -d --name mynginx <nginx-image>
--filter "name=^/$name$"
$
需要第一个字符。
使用docker top更短:
docker top <name> || docker run --name <name> <image>
docker top
如果没有与运行名称匹配的容器,则返回非零,否则返回pid,用户,运行时间和命令。
强大的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版本便为方便起见:
containers = subprocess.check_output([
'sudo',
'docker',
'ps',
'-a',
'--format', '{{.Names}}',
]).decode()
if container_name in containers.split():
# Exists.
我使用以下代码来确定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
这是我检查容器是否正在运行,停止它,然后将其删除的解决方案。
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
我已经搜索了太多次了,因为即使上面的100+答案实际上也不起作用。我认为原因是对docker ps的误解。docker ps
列出正在运行的容器。docker ps -q
这样做是一样的,但是输出条带化为仅包含container_id。docker ps -a
列出所有容器(是否在运行)。docker ps -qa
然后是所有容器docker ps -q
的简单列表,而是正在运行的容器的简单列表。docker ps -q -f name=ContainerName
然后是名称为ContainerName的运行中容器的简单列表。docker ps -qa -f
也会包含退出的容器,因此逻辑必须是检查-a(是否正在运行),然后不使用-a来检查它是否不仅存在而且还在运行(并且需要首先停止)。
if [[ $(sudo docker inspect --format . <container-name>) == "." ]]; then
docker run <container-name>;
fi
说明:
已经有类似的回应。这里的区别是--format .
选项(您也可以使用-f .
)。这将从检查命令中删除所有详细信息。Docker使用go模板格式,在这种情况下,这意味着它将将其无法识别的任何内容复制到输出中。
因此,如果退出具有该namex的容器,-f itIsThere
则将返回itIsThere
。如果不是,则docker将返回错误代码和消息(Error: No such object: <container-name>
)。
我在詹金斯的日志中找到了这个。
在bash脚本中,我检查容器是否按如下名称存在:
CONTAINER_NAME="my-container-name"
if ! docker container ls -a | grep -Fq "$CONTAINER_NAME" 1>/dev/null; then
echo "could not found container $CONTAINER_NAME..."
fi
-a
如果要列出所有状态(已停止,正在运行等)
-f status=running
(如果只列出正在运行的容器,则不需要)
$ docker ps -f name=containerName | grep containerName
如果有1行或更多行,则命令的状态码将为0。如果没有容器,则grep将以1状态码结尾。您可以通过以下方式处理它:
视窗
$ echo %errorlevel%
的Linux
$ echo $?
参考:https : //www.cyberciti.biz/faq/linux-bash-exit-status-set-exit-statusin-bash/
-a
或尝试运行退出的容器都会失败。