如果尚未运行,如何运行docker容器

时间:2017-06-24 00:03:04

标签: docker

我只有在尚未运行时才需要运行docker容器。鉴于此命令。如果它不存在,我将如何运行它。

docker run --name nginx -d nginx

我对任何脚本或语言都持开放态度。

4 个答案:

答案 0 :(得分:30)

我肯定建议按照上面的回答查看docker-compose和docker-compose up

由于您的问题是关于docker run,我会像这样简化VonC的答案

docker start nginx || docker run --name nginx -d nginx

如果容器已在运行,docker start将返回0,因此不会执行docker run。如果容器EXISTS但未运行,docker start将启动它,否则docker run会创建它。

VonC的答案中缺少“存在但已停止”的部分。

答案 1 :(得分:14)

使用过滤器检查是否存在某个名称的容器:
(见docker ps Filterring

#!/bin/bash

name='nginx'

[[ $(docker ps -f "name=$name" --format '{{.Names}}') == $name ]] ||
docker run --name nginx -d nginx

只有在第一部分为假时才会执行docker run

答案 2 :(得分:2)

如果您对任何语言持开放态度,我建议您使用docker-compose执行此任务。安装后,使用以下内容创建名为docker-compose.yml的文件:

version: '2'
services:
  nginx:
    image: 'nginx' 

然后使用:

docker-compose up -d

它将始终检查容器是否已在运行。如果容器不存在,它将创建并运行。如果容器停止,它就运行它。

最好的办法是,如果你更改了docker-compose.yml或者拉了一个新版本的图像,它将自动重新创建容器,保留所有卷甚至是未命名的卷。

问候

答案 3 :(得分:1)

如果目的是幂等并且所讨论的容器是可互换的(例如您的示例),那么系统的当前状态(正在/正在运行)都无关紧要。

在空白板上。

$ docker ps -a --format '{{.Names}}' | wc -l
0

当容器存在时执行力移除并创建。

$ docker run --name=hello -d alpine sleep inf
0f6175804d69d48cdada66de57cb62c2855d1085c08a69f21e782c433be2c6a2
$ docker ps --format '{{.Names}}'
hello
$ docker rm -f hello ||:
hello
$ docker run --name=hello -d alpine sleep inf 
...

与没有时完全相同。

$ docker ps -a --format '{{.Names}}' | wc -l
0
$ docker rm -f hello 2>/dev/null ||:
$ docker run --name=hello -d alpine sleep inf
d0210fefc7e934fea6d669615538596cf372f15e9095edae81c35965ff021898

执行条件检查时完全相同。

$ docker ps -a --format '{{.Names}}'
hello
$ if ! docker ps -a --format '{{.Names}}' | grep hello >/dev/null ;then 
> docker run --name=hello -d alpine sleep inf 
> fi
$ docker rm -f hello
hello
$ if ! docker ps -a --format '{{.Names}}' | grep hello >/dev/null ;then 
> docker run --name=hello -d alpine sleep inf 
> fi
1edcbba0c01979edbe05072bd3c15b6ecfb129d9e20d45a33eff0921cc5f2ed3

这使得强制删除/创建幂等操作,在这种情况下,我们对状态的保证,后期操作使条件句变得毫无意义和and琐。

如果您的容器必须观察某些基础状态,那么就把所有这些都忘了吧。