How to run a docker container if not already runni

2020-02-18 17:16发布

I need to run a docker container only if its not already running. Given this command. How would I run it only if it does not exists.

docker run --name nginx -d nginx

I am open to any script or language.

标签: docker
3条回答
仙女界的扛把子
2楼-- · 2020-02-18 17:28

I would definitely suggest looking into docker-compose and docker-compose up as answered above.

Since your question is about docker run, i would simplify the answer of VonC like this

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

If the container already is running, docker start will return 0 thus no docker run is executed. If the container EXISTS but is not running, docker start will start it, otherwise it docker run creates it.

The "exists but stopped" part is missing in VonC's answer.

查看更多
叼着烟拽天下
3楼-- · 2020-02-18 17:44

Well if you are open to any language I recommend using docker-compose for this task. After installing it, create a file called docker-compose.yml with this content:

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

Then use:

docker-compose up -d

It will always check if the container is already running. If the container doesn't exists it will create it and run. If the container is stopped it just run it.

The best thing is if you alter the docker-compose.yml or pull a new version of the image it will automatically recreate the container preserving all volumes even the unnamed ones.

Regards

查看更多
啃猪蹄的小仙女
4楼-- · 2020-02-18 17:48

Use a filter to check if a container of a certain name exists:
(See docker ps Filterring)

#!/bin/bash

name='nginx'

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

The docker run will only be executed if the first part is false.

To be on the safe side (docker ps might return several names), you might alternatively do (if you think the word "nginx" can't be part of any container name):

if ! docker ps --format '{{.Names}}' | grep -w nginx &> /dev/null; then
    docker run --name nginx -d nginx
fi

Or:

if ! docker ps --format '{{.Names}}' | egrep '^nginx$' &> /dev/null; then
    docker run --name nginx -d nginx
fi
查看更多
登录 后发表回答