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