2016-07-25 34 views
23

在Jenkins机器上,我想创建一个具有指定名称的码头集装箱,只要它尚不存在(在shell脚本中)。我想我可能会运行命令来创建容器,无论如何忽略失败,但是这会导致我的jenkins作业失败。如果码头集装箱不存在,则执行bash命令

因此,我想知道如何检查泊坞窗容器是否存在或不使用bash。

回答

42

您可以通过grepping为<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 
+2

右键 - 你所需要的'-a'或试图运行退出容器将失败。 – ldg

+3

如果您有两个具有相似名称的容器,则此响应不起作用。例如:cool.project(容器1)和dashboard.cool.project(容器2) –

+1

@MaximTkach这就是为什么使用第二种方法更好,您可以在docker ps命令中完全限定容器的名称。但是,您也可以在grep命令中引入一个正则表达式来在名称前后查找空格。这个测试是故意留给读者的。 – ferdy

8

您可以使用filterformat个选项docker ps命令,以避免管道与UNIX工具一样grepawk

name='nginx' 

[[ $(docker ps -f "name=$name" --format '{{.Names}}') == $name ]] || 
echo "start your nginx docker here" 
3

只是^ /及使用$前缀后缀的名称。这似乎是一个正则表达式:

CONTAINER_NAME='mycontainername' 

CID=$(docker ps -q -f status=running -f name=^/${CONTAINER_NAME}$) 
if [ ! "${CID}" ]; then 
    echo "Container doesn't exist" 
fi 
unset CID 
6

我想

docker container inspect <container-name> || docker run... 

因为码头工人集装箱检查调用设置$?如果容器不存在(不能检查),则将其设置为1,但如果存在(如果容器已停止),则设置为0。所以运行命令只会在容器不按预期存在的情况下被调用。

+0

我甚至会用'docker container inspect >/dev/null 2>&1'放弃成功和不成功的输出。 – Mike

1

我用下面的代码,以确定是否搬运工容器存在:

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