Мне нужно запустить контейнер докеров, только если он еще не запущен. С учетом этой команды. Как я могу запустить его, только если он не существует.
docker run --name nginx -d nginx
Я открыт для любого script или языка.
Мне нужно запустить контейнер докеров, только если он еще не запущен. С учетом этой команды. Как я могу запустить его, только если он не существует.
docker run --name nginx -d nginx
Я открыт для любого script или языка.
Используйте фильтр, чтобы проверить, существует ли контейнер с определенным именем:
(См. Докер 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
Я определенно предложил бы изучить 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.
Хорошо, если вы открыты для любого языка, я рекомендую использовать docker-compose для этой задачи. После установки создайте файл с именем docker-compose.yml со следующим содержимым:
version: '2'
services:
nginx:
image: 'nginx'
Тогда используйте:
docker-compose up -d
Он всегда будет проверять, запущен ли контейнер. Если контейнер не существует, он создаст его и запустит. Если контейнер остановлен, просто запустите его.
Лучше всего, если вы измените docker-compose.yml или извлечете новую версию образа, он автоматически воссоздает контейнер, сохраняя все тома, даже безымянные.
С уважением