Автоматически запустите связанные зависимости контейнера докера

Я выполняю gitlab в контейнере докера, и он разделяет свои зависимости (MySQL, Redis, Mailserver) вполне приятно в отдельные контейнеры докера. Выполнение их не является проблемой, я запускаю их в обратном порядке: зависимости сначала, чем сам gitlab.

Время от времени я должен перезапустить хост докера. В настоящее время я ssh в хост докера и вручную перезапускаю контейнеры. Существует ли лучший путь к нему? Как просто говорят некоторому сервису запускать gitlab контейнер, и он заботится о запуске его зависимостей сначала? Я знаю, что могу создать отдельные init сценарии для каждого контейнера докера, но это не то, что я ищу.

5
задан 16 October 2014 в 19:44
3 ответа

Возможно, вы даже захотите заглянуть в проект 'official' Fig, который теперь заменен на Docker Compos . Настройка/настройка должна быть довольно простой.

Ваш случай использования gitlab в основном тот же, что и Fig - Wordpress example или с помощью скрипта gitlab-compose script

. А если вы работаете на Mac, то, возможно, вы захотите взглянуть на Docker toolbox, который включает в себя не только Compose, но и различные другие инструменты для быстрого ввода в эксплуатацию!

.
2
ответ дан 3 December 2019 в 01:31

Я думаю, вы можете посмотреть Decking

Также вы можете управлять зависимости так, как это делает 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 one и т. Д.

2
ответ дан 3 December 2019 в 01:31

В случае, если кто-то найдет это полезным, я написал сценарий оболочки 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 с тем же именем. Он также не имеет дело с круговыми зависимостями (я не знаю, имеет ли это какой-либо другой инструмент), но он также был написан менее чем за полчаса. Если у вас только один контейнер, вы просто используете функцию docker_linkks_lookup вроде этой:

docker_links_lookup {{container_name}} | awk '!seen[$0]++' | xargs docker start

Edit:

Другая удобная функция, которую я начал использовать в вышеуказанном скрипте, это:

# 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)

Эта последняя строка гарантирует, что все контейнеры будут запущены только после их зависимостей, в то время как вы также будете ждать, пока зависимости действительно завершат свой запуск. Обратите внимание, что это, вероятно, не применимо к каждой установке, так как некоторые серверы могут сразу открыть свои порты, не будучи на самом деле готовыми (хотя я не знаю ни одного сервера, который действительно делает это, но это причина, которую разработчики докеров дают, когда спрашивают их о такой возможности, как эта).

2
ответ дан 3 December 2019 в 01:31

Теги

Похожие вопросы