я бегу gitlab в контейнере докеров и он довольно хорошо разделяет свои зависимости (MySQL, Redis, Mailserver) на отдельные контейнеры докеров. Запустить их не проблема, я запускаю их в обратном порядке: сначала зависимости, а не сам gitlab.
Время от времени мне приходится перезапускать докер-хост. В настоящее время я подключаюсь к хосту докеров по ssh и вручную перезапускаю контейнеры. Есть ли способ лучше? Например, просто скажите какой-то службе запустить контейнер gitlab, и он сначала позаботится о запуске своих зависимостей? Я знаю, что могу создавать отдельные сценарии инициализации для каждого контейнера докеров, но это не то, что я ищу.
Если кто-то сочтет это полезным, я написал fish
сценарий оболочки (должен быть легко переносимым на bash
) с помощью docker inspect
чтобы запустить все зависимости моих контейнеров. Вот код, используя jq чтобы разобрать json:
#!/usr/local/bin/fish
# Start all containers
# Returns all the dependencies of the input + the input, eg. [dep1, dep2, input]
function docker_links_lookup
set result (docker inspect $argv[1] | jq ".[0].HostConfig.Links" | pcregrep -o1 "\"/(.*):.*\"")
for x in $result
docker_links_lookup $x
echo $x
end
end
# Returns all docker containers in the current directory, including their dependencies
function all_docker_containers
for dir in */
if test -f "$dir/Dockerfile"
set container_name (echo $dir | sed "s/\///") #remove trailing /
docker_links_lookup $container_name
echo "$container_name"
end
end
end
# Take all docker containers and dependencies, filter out duplicates without changing the order (the awk command), then start the containers in that order
all_docker_containers | awk '!seen[$0]++' | xargs docker start
Обратите внимание, что этот код предполагает, что в текущем каталоге есть подкаталоги, которые соответствуют контейнеру докеров с тем же именем. Он также не имеет отношения к циклическим зависимостям (я не знаю, поддерживает ли какой-либо другой инструмент), но он также был написан менее чем за полчаса. Если у вас только один контейнер, вы просто используете docker_links_lookup
работают так:
docker_links_lookup {{container_name}} | awk '!seen[$0]++' | xargs docker start
Редактировать:
Еще одна удобная функция, которую я начал использовать в приведенном выше сценарии, - это:
# This starts the docker containers that are passed in, and waits on the ports they expose
function start_and_wait
for container in $argv
set ports (docker inspect $container | jq ".[0].Config.ExposedPorts | keys" 2>/dev/null | egrep -o "[0-9]+" | xargs)
docker start $container
docker run -e PORTS="$ports" --link $container:wait_for_this n3llyb0y/wait > /dev/null
end
end
Вместо того, чтобы просто запустить контейнер, он ищет порты, которые предоставляет контейнер, и проверяет, может ли он подключиться к ним. Полезно, если у вас есть такие вещи, как контейнер базы данных, который может выполнять очистку при запуске и, следовательно, требуется некоторое время, чтобы действительно быть доступным в сети. Используйте это так:
start_and_wait {{container_name}}
Или, если вы используете приведенный выше сценарий, замените последнюю строку на это:
start_and_wait (all_docker_containers | awk '!seen[$0]++' | xargs -n 1)
Эта последняя строка гарантирует, что все контейнеры запускаются только после того, как их зависимости, а также ожидают, пока зависимости действительно завершат свой запуск. Обратите внимание, что это, вероятно, не применимо к каждой настройке, так как некоторые серверы могут сразу открывать свои порты, фактически не будучи готовыми (хотя я не знаю каких-либо серверов, которые действительно делают это, но это причина, по которой разработчики докеров указывают, когда спрашивают их о такой функции).
Я думаю ты можешь посмотреть на Настил
Также вы можете управлять зависимостями так, как это делает CoreOS. Написав Unit
файл для вашего основного gitlab
контейнер вроде:
[Unit]
...
Requires=docker.service
Requires=redis.service
Requires=mysql.service
...
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill gitlab
ExecStartPre=-/usr/bin/docker rm gitlab
ExecStart=/usr/bin/docker run --name gitlab gitlab
ExecStop=/usr/bin/docker stop gitlab
куда mysql.serice
является Unit
файл для контейнера MySQL, redis.service
Redis и т. д.
Возможно, вы даже захотите заглянуть в «официальный» инжир проект, который теперь заменен на Docker Compose. Настроить / настроить должно быть довольно легко.
Ваш вариант использования gitlab в основном такой же, как и Рис - Пример Wordpress или используя gitlab-compose скрипт
А если вы работаете на Mac, возможно, вам захочется взглянуть на Набор инструментов Docker который включает в себя Compose, а также различные другие инструменты для быстрого начала работы!