Как запустить контейнер докера, если он еще не запущен

Мне нужно запустить контейнер докеров, только если он еще не запущен. С учетом этой команды. Как я могу запустить его, только если он не существует.

docker run --name nginx -d nginx

Я открыт для любого script или языка.

Ответ 1

Используйте фильтр, чтобы проверить, существует ли контейнер с определенным именем:
(См. Докер ps Filterring)

#!/bin/bash

name='nginx'

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

Запуск docker run будет docker run, только если первая часть ложна.

Чтобы быть в безопасности (docker ps может вернуть несколько имен), вы можете сделать это альтернативно (если вы думаете, что слово "nginx" не может быть частью какого-либо имени контейнера):

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

Или же:

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

Ответ 2

Я определенно предложил бы изучить docker-compose и docker-compose up как было сказано выше.

Поскольку ваш вопрос касается docker run, я бы упростил ответ VonC, как этот

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

Если контейнер уже запущен, docker start вернет 0 поэтому docker run не выполняется. Если контейнер СУЩЕСТВУЕТ, но не работает, docker start запустит его, в противном случае его docker run создаст его.

Часть "существует, но остановлена" отсутствует в ответе VonC.

Ответ 3

Хорошо, если вы открыты для любого языка, я рекомендую использовать docker-compose для этой задачи. После установки создайте файл с именем docker-compose.yml со следующим содержимым:

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

Тогда используйте:

docker-compose up -d

Он всегда будет проверять, запущен ли контейнер. Если контейнер не существует, он создаст его и запустит. Если контейнер остановлен, просто запустите его.

Лучше всего, если вы измените docker-compose.yml или извлечете новую версию образа, он автоматически воссоздает контейнер, сохраняя все тома, даже безымянные.

С уважением