Docker运行命令创建容器(如果不存在)

Lio*_*hAu 6 docker

作为 Docker 新手,我尝试在 TFS / azure devops 构建过程中从 docker hub 运行“selenoid”容器。第一次执行有效,但在接下来的执行过程中,我收到冲突错误(具有该名称的容器已存在)。阅读了这里的几篇文章后,我了解到我有两个解决方案:

1/保留运行命令,但在再次运行之前在该容器上执行“rm”命令。

2/确定容器是否已存在并使用“start”进行下一次构建运行。

对于第一个解决方案,我想每次删除/重新创建该容器并不是真正有效?我考虑过第二个,但制作一个检查容器是否存在的脚本,然后使用启动或运行也有点复杂。

那么,是否有一个简单的“运行”选项/标志可以更改“运行”命令行为,以便仅在需要时创建容器,然后启动它?

另外,我本可以制作一个脚本来完成这项工作,但我更喜欢在这里问它,因为也许我不理解使用容器的正确方法(如果我是唯一一个要求该选项的人,我可能错过了某物...)

SiH*_*iHa 8

Docker 容器本来就是短暂的。你旋转它们,它们做它们的事情,它们死亡,它们被移除(并且不消耗任何资源)。

除非容器正在初始化数据库或其他在启动时需要很长时间的事情,或者您需要维护状态(没有卷安装),那么最简单的事情就是使用--rm标志运行它,这样当它完成后它就会自行移除。

docker run --rm --name mycontainer image:tag

当然,正如上面已经评论的那样。通常,如果您需要在运行时执行容器,则通常只需为容器命名。因为看起来它只是运行并退出,所以这可能是不必要的。

当然,这并不是说您不能拥有长期运行的容器。但如果它们自然退出,那么通常应该将它们清理掉,而不是跳过去重新开始同样的事情。


tho*_*son 5

我不知道 docker 中的标志可以满足您的需要。但正如你所说,只需使用脚本即可。例如,这个 bash 脚本应该可以解决问题:

#!/usr/bin/env bash

CONTAINER_NAME=example_name

if [[ $(docker ps -a --filter="name=$CONTAINER_NAME" --filter "status=exited" | grep -w "$CONTAINER_NAME") ]]; then
    echo "docker start ..."
elif [[ $(docker ps -a --filter="name=$CONTAINER_NAME" --filter "status=running" | grep -w "$CONTAINER_NAME") ]]; then
    echo "docker still running"
else
    echo "docker run ..."
fi
Run Code Online (Sandbox Code Playgroud)

有更多可能的状态,例如:已创建、正在重新启动、正在运行、正在删除、已暂停、已退出或已死亡

这意味着如果容器已经启动或创建、删除、暂停,则脚本不防水。如果你点击 docker run,你只会得到一个错误,但你会明白要点,并且可能可以从这里继续。也许你永远不会遇到这些情况。