¿Cómo ejecutar docker-compose en el arranque?


20

Esto está en una máquina virtual Ubuntu 14.04 LTS con Docker y sospecho que respawnes la causa de mi problema, pero no estoy seguro de la solución ideal.

Script de inicio actual ( cat /etc/init/dockersuitecrm.conf)

description "Start docker containers"
author "Batman"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
    docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start
end script

Esto 'funciona' porque myappestá vivo y responde, pero /sbin/initocupa toda la CPU cuando monitorizo htop. Si elimino la entrada de upstart ( sudo rm /etc/init/dockersuitecrm.conf) y manualmente SSH y la ejecuto docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start, no veo la CPU al 100% de problemas y, como antes, myappvuelve a estar activa y receptiva.

Entonces sospecho que la forma en que estoy comenzando Docker-compose es incorrecta. ¿Cuál es la forma correcta de comenzar docker-composesiempre funcionando sin intervención manual?

EDITAR: No debería importar sino /usr/bin/myapp -> /home/batman/dockerapps/myappcomo un enlace simbólico.


No es una solución, pero como solución alternativa, puedo ejecutar esto sin el respawncomando en el script.
DeepSpace101

La misma pregunta, pero vi esto: serverfault.com/questions/615820/… . La magia es con el uso docker-compose start.
Mark Lopez

Tengo una configuración similar pero no uso un scriptbloque. Tal vez eso es parte del problema? Tengo chdir /usr/bin/myapp/y en la siguiente línea en su exec docker-compose uplugar.
jmreicha

¿No solo quieres ejecutar docker-compose en segundo plano? es decirdocker-compose up -d
KCD

poner reinicio: siempre en la especificación del contenedor
Lu32

Respuestas:


9

Simplemente use crontab, en lugar de usar un intervalo de tiempo, simplemente diga @reboot

Inicie sesión como el usuario que debe iniciar este script y escriba el comando

crontab -e

y luego ingrese

@reboot /better/enter/fullpath/here/docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp start

Reinicie el sistema y vea si funciona. Hay una ventaja sobre el arranque, incluso si se inicia un poco más tarde, no tiene que preocuparse mucho por las dependencias como las redes, etc. para estar listo.


¿Alguna idea de qué tan limpio sería un reinicio de esta manera?
Justin Smith el

1
Lo siento, pero esta no es una muy buena respuesta. Puede funcionar de vez en cuando, pero como el cron puede cargarse antes que otros requisitos de la ventana acoplable, te encuentras con una condición de carrera.
Oteo

2

Suponiendo que está utilizando la versión 2 de las definiciones de Docker Compose en usted docker-compose.yml, puede hacer lo siguiente:

Definiendo restart: alwaysasí:

version: '2'
services:
  web:
    image: nginx
    restart: always

Referencia: https://docs.docker.com/compose/compose-file/compose-file-v2/


1
La pregunta es, qué sitio de Docker no responde, fue: "¿Cuál es la forma correcta de comenzar a componer Docker siempre se ejecuta sin intervención manual?"
Oteo

0

Docker no está listo de inmediato. Si ejecuta el script demasiado pronto, no pasará nada. El docker comenzará a responder al comando docker ps tan pronto como esté listo para que pueda usar este truco en crontab:

nano / etc / crontabs / root

@reboot / usr / bin / docker ps && / usr / bin / docker-compose -f /prod.yml start

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.