Inicie automaticamente as dependências vinculadas do contêiner do docker

Eu corro gitlab em um contêiner docker e separa suas dependências (MySQL, Redis, Mailserver) muito bem em contêineres docker separados. Executá-los não é um problema, eu os inicio na ordem inversa: as dependências primeiro, do que o próprio gitlab.

De vez em quando, tenho que reiniciar o host docker. Atualmente Eu ssh no host docker e reinicio manualmente os contêineres. Existe uma maneira melhor para isso? Como apenas dizer a algum serviço para iniciar o contêiner gitlab e ele se encarrega de iniciar suas dependências primeiro? Eu sei que posso criar scripts init individuais para cada contêiner docker, mas não é isso que estou procurando.

Você pode até querer olhar para o 'oficial' Figo projeto, que agora foi substituído por Docker Compose. Deve ser bastante fácil de configurar / configurar.

Seu caso de uso de executar o gitlab é basicamente o mesmo que o Fig-exemplo Wordpress ou usando o gitlab-escrever script

E se você estiver trabalhando em um Mac, você pode querer dar uma olhada no Docker toolbox o que inclui compor, mas também várias outras ferramentas para se levantar e correr rapidamente!

Eu acho que você pode olhar para Estrado

Além disso, você pode gerenciar dependências de uma forma CoreOS faz isso. Escrevendo um Unit arquivo para o seu principal gitlab recipiente como:

[Unit]...Requires=docker.serviceRequires=redis.serviceRequires=mysql.service...[Service]TimeoutStartSec=0ExecStartPre=-/usr/bin/docker kill gitlabExecStartPre=-/usr/bin/docker rm gitlabExecStart=/usr/bin/docker run --name gitlab gitlabExecStop=/usr/bin/docker stop gitlab

Onde mysql.serice e Unit arquivo para MySQL container, redis.service um Redis, etc.

Caso alguém ache isso útil, escrevi um fish shell script (deve ser facilmente portátil para bash) mear docker inspect para iniciar todas as dependências dos meus contêineres. Aqui está o código, usando jq para analisar o 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    endend# Returns all docker containers in the current directory, including their dependenciesfunction 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    endend# Take all docker containers and dependencies, filter out duplicates without changing the order (the awk command), then start the containers in that orderall_docker_containers | awk '!seen[$0]++' | xargs docker start

Observe que este código assume que existem subdiretórios no diretório atual que correspondem a um contêiner docker com o mesmo nome. Ele também não lida com dependências circulares (não sei se alguma das outras ferramentas o faz), mas também foi escrito em menos de meia hora. Se você tiver apenas um único contêiner, basta usar o docker_links_lookup função como esta:

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

Editar:

Outra função útil que comecei a usar no script acima é esta:

# This starts the docker containers that are passed in, and waits on the ports they exposefunction 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    endend

Em vez de apenas iniciar um contêiner, ele procura as portas que o contêiner expõe e testa para ver se ele pode se conectar a elas. Útil se você tiver coisas como um contêiner de banco de dados, que pode realizar limpezas quando ele é iniciado e, portanto, levar algum tempo para realmente estar disponível na rede. Use assim:

start_and_wait {{container_name}}

Ou, caso você esteja usando o script acima, substitua a última linha por esta:

start_and_wait (all_docker_containers | awk '!seen[$0]++' | xargs -n 1)

Esta última linha garantirá que todos os contêineres sejam iniciados somente após suas dependências, enquanto também aguarda que as dependências realmente concluam sua inicialização. Observe que isso provavelmente não é aplicável a todas as configurações, pois alguns servidores podem abrir suas portas imediatamente, sem realmente estar prontos (embora eu não conheça nenhum servidor que realmente faça isso, mas esta é a razão pela qual os desenvolvedores do docker fornecem ao perguntar a eles sobre um recurso como este).