Iniciar automáticamente las dependencias vinculadas del contenedor docker

Yo corro gitlab en un contenedor docker y separa sus dependencias (MySQL, Redis, servidor de correo) bastante bien en contenedores docker separados. Ejecutarlos no es un problema, los comienzo en orden inverso: las dependencias primero, que el propio gitlab.

De vez en cuando tengo que reiniciar el host de Docker. Actualmente, hago ssh en el host de docker y reinicio manualmente los contenedores. ¿Hay una mejor manera de hacerlo? ¿Como decirle a algún servicio que inicie el contenedor gitlab y se encarga de iniciar sus dependencias primero? Sé que puedo crear scripts de inicio individuales para cada contenedor de docker, pero eso no es lo que estoy buscando.

Es posible que incluso desee buscar en el 'oficial' Higo proyecto, que ahora ha sido reemplazado por Composición de Docker. Debería ser bastante fácil de configurar / setup.

Su caso de uso de ejecutar gitlab es básicamente el mismo que el Fig-Ejemplo de WordPress o mediante el uso de la gitlab-script de composición

Y si está trabajando en una Mac, es posible que desee echar un vistazo a Caja de herramientas de Docker que incluye Compose, pero también varias otras herramientas para ponerse en marcha rápidamente.

Creo que puedes mirar Cubiertas

También puede administrar las dependencias de una manera que CoreOS lo hace. Escribiendo un Unit archivo para su principal gitlab tipo de contenedor:

[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

Donde mysql.serice ser Unit archivo para contenedor MySQL, redis.service uno de Redis, etc.

En caso de que alguien encuentre esto útil, escribí un fish script de shell (debe ser fácilmente portátil a bash) utilizar docker inspect para iniciar todas las dependencias de mis contenedores. Aquí está el código, usando jq para analizar el 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

Tenga en cuenta que este código asume que hay subdirectorios en el directorio actual que corresponden a un contenedor de docker con el mismo nombre. Tampoco se ocupa de las dependencias circulares (no se si alguna de las otras herramientas lo hace), pero también se escribió en menos de media hora. Si solo tiene un contenedor, simplemente use el docker_links_lookup funciona así:

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

Editar:

Otra función útil que comencé a usar en el script anterior es 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

En lugar de simplemente iniciar un contenedor, busca los puertos que el contenedor expone y prueba para ver si puede conectarse a ellos. Útil si tiene cosas como un contenedor de base de datos, que puede realizar limpiezas cuando se inicia y, por lo tanto, tardar un tiempo en estar realmente disponible en la red. Úsalo de esta manera:

start_and_wait {{container_name}}

O en caso de que esté utilizando el script anterior, reemplace la última línea con esto:

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

Esta última línea se asegurará de que todos los contenedores solo se inicien después de sus dependencias, mientras que también esperará a que las dependencias realmente completen su inicio. Tenga en cuenta que esto probablemente no sea aplicable a todas las configuraciones, ya que algunos servidores pueden abrir sus puertos de inmediato, sin estar realmente listos (aunque no conozco ningún servidor que realmente haga esto, pero esta es la razón que los desarrolladores de docker dan cuando les preguntan sobre una característica como esta).