¿Cómo ejecutar docker-compose up -d al iniciar el sistema?

114

Para permitir que los contenedores se inicien automáticamente en el punto de inicio, intenté agregar el comando:

cd directory_has_docker-compose.yml && docker-compose up -d en /etc/rc.local.

pero luego de reiniciar la máquina, los contenedores no funcionan.

¿Cómo se ejecuta docker-compose up -dal inicio del sistema?

user39544
fuente
3
use --restart alwayso --restart unless-stoppedo en docker-compose.yml use restart: always-> Ref . ¡Pero quizás no funcionó en algunos contenedores!
Benyamin Jafari

Respuestas:

129

Cuando usamos crontabo el /etc/rc.localarchivo obsoleto , necesitamos un retraso (por ejemplo sleep 10, dependiendo de la máquina) para asegurarnos de que los servicios del sistema estén disponibles. Por lo general, systemd(o upstart) se usa para administrar qué servicios se inician cuando se inicia el sistema. Puede intentar usar una configuración similar para esto:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

O, si quieres correr sin la -dbandera:

# /etc/systemd/system/docker-compose-app.service

[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/srv/docker
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
StartLimitIntervalSec=60
StartLimitBurst=3

[Install]
WantedBy=multi-user.target

Cambie el WorkingDirectoryparámetro con la ruta de su proyecto acoplada. Y habilite el servicio para que se inicie automáticamente:

systemctl enable docker-compose-app
Oleg Belostotsky
fuente
¿Existe una forma sencilla de probar si funciona sin reiniciar Raspberry?
dmigo
2
Esta es la respuesta más elegante en mi opinión
kuzyn
2
@dmigo systemctl start docker-compose-appy creo que systemctl status docker-compose-appson lo que estás buscando.
HectorJ
no funcionó para mí, cuando me encontré systemctl start docker-compose-appcon esto:Job for docker-compose-app.service failed because the control process exited with error code. See "systemctl status docker-compose-app.service" and "journalctl -xe" for details
Benyamin Jafari
1
@dmigo: prueba el inicio de su servicio con:, service docker-compose-app startestado con service docker-compose-app status, detener conservice docker-compose-app stop
BarryPye
96

Debería poder agregar:

restart: always 

a cada servicio que desee reiniciar en el archivo docker-compose.yml

MaxiReglisse
fuente
6
Tenga en cuenta que deben estar ejecutándose cuando se reinicia, así que no los detenga manualmente antes del reinicio.
Tom
algunos servicios como Nginx no se inicia ni siquiera con esta opción.
Benyamin Jafari
15
Ésta es la respuesta adecuada a la pregunta. Hay una forma diseñada de reiniciar contenedores, por qué entrar en trabajos cron y otras formas de reinventar la rueda.
Taha Rehman Siddiqui
Esta es la respuesta correcta. Cuando comience a usar Kubernetes en lugar de cron, se alegrará de haberlo usado.
pferrel
9
@TahaRehmanSiddiqui Tenga en cuenta que restart: alwaystiene algunos errores graves: los montajes de host no se adjuntarán al reiniciar, por ejemplo. En mi opinión, es mejor reinventar la rueda, si la rueda existente es cuadrada.
okdewit
73

Si está docker.servicehabilitado al iniciar el sistema

$ sudo systemctl enable docker

y tus servicios en tu docker-compose.ymlhas

restart: always

todos los servicios se ejecutan cuando reinicia su sistema si ejecuta el siguiente comando solo una vez

docker-compose up -d
masoud vatandoost
fuente
2
esta debería ser la solución más elegante
Carl Cheung
34

Lo intenté restart: always, funciona en algunos contenedores (como php-fpm), pero enfrenté el problema de que algunos contenedores (como nginx) todavía no se reinician después del reinicio.

Resuelve el problema.

crontab -e

@reboot (sleep 30s ; cd directory_has_dockercomposeyml ; /usr/local/bin/docker-compose up -d )&
user39544
fuente
2
¿Por qué un voto negativo para esta respuesta? ¿La respuesta no es útil? ¿Está mal en algún sentido? Un comentario sería útil para que el respondedor y otras personas sepan cuál es el problema.
Ayushya
5
Debe sospechar de los sueños desnudos, ya que introducen un comportamiento no determinista: martinfowler.com/articles/…
giorgiosironi
@giorgiosironi sleep está bien en este caso. La puesta en marcha del contenedor debe poder manejar un comportamiento no determinista de todos modos.
z0r
4
También está introduciendo hasta 30 segundos de latencia que pueden no ser necesarios.
giorgiosironi
@ z0r dormir no está bien! El sueño puede "funcionar", pero cualquier secuencia de inicio debe ser determinista. Los servicios de Linux utilizan dependencias para garantizar que cosas como la red estén disponibles, etc. antes de comenzar. Deberías hacer lo mismo.
colm.anseo
25

Use reiniciar: siempre en su docker compose file.

Docker-compose up -dlanzará el contenedor de imágenes nuevamente. Úselo docker-compose startpara iniciar los contenedores detenidos, nunca lanza nuevos contenedores a partir de imágenes.

nginx:   
    restart: always   
    image: nginx   
    ports:
      - "80:80"
      - "443:443"   links:
      - other_container:other_container

También puede escribir el código en el archivo de la ventana acoplable para que se cree primero, si tiene la dependencia de otros contenedores.

Vaseem007
fuente
1
Puede que no quieras usar always, pero tal vez unless-stopped. Otras opciones son on-failurey no. Esto se conoce como política de reinicio .
Paul
5

Como adición a user39544la respuesta de, un tipo más de sintaxis para crontab -e:

@reboot sleep 60 && /usr/local/bin/docker-compose -f /path_to_your_project/docker-compose.yml up -d
TitanFighter
fuente
Esto funcionó para mí en marzo de 2018 en un RPi3 con Raspian. Corrí crontab -ecomo usuario pi, con pi miembro del grupo acoplador ...
Scott Veirs