Comment exécuter docker-compose au démarrage?

20

C'est sur une machine virtuelle Ubuntu 14.04 LTS exécutant Docker et je pense que respawnc'est la cause de mon problème mais je ne suis pas sûr de la solution idéale.

Script parvenu actuel ( 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

Cela `` fonctionne '' en ce qu'il myappest vivant et réactif, mais /sbin/initprend tout le processeur lorsque je surveille htop. Si je supprime l'entrée de upstart ( sudo rm /etc/init/dockersuitecrm.conf) et SSH manuellement et que docker-compose -f /usr/bin/myapp/docker-compose.yml -p myapp startje lance, je ne vois pas le processeur à 100% et comme avant, il myappest à nouveau vivant et réactif.

Je soupçonne donc que la façon dont je démarre la composition de docker ci-dessus est incorrecte. Quelle est la bonne façon de démarrer docker-composefonctionne toujours sans intervention manuelle?

EDIT: ne devrait pas avoir d'importance, mais /usr/bin/myapp -> /home/batman/dockerapps/myappcomme un lien symbolique.

DeepSpace101
la source
Pas une solution mais comme solution de contournement, je suis capable d'exécuter cela sans la respawncommande dans le script.
DeepSpace101
Même question, mais j'ai vu ceci: serverfault.com/questions/615820/… . La magie réside dans l'utilisation docker-compose start.
Mark Lopez
J'ai une configuration similaire mais n'utilise pas de scriptbloc. Peut-être que cela fait partie du problème? J'ai chdir /usr/bin/myapp/et sur la ligne suivante à la exec docker-compose upplace.
jmreicha
Vous ne voulez pas simplement exécuter docker-compose en arrière-plan? soitdocker-compose up -d
KCD
mettre le redémarrage: toujours dans la spécification du conteneur
Lu32

Réponses:

9

Utilisez simplement crontab, au lieu d'utiliser un intervalle de temps, dites simplement @reboot

Alors connectez-vous en tant qu'utilisateur qui doit démarrer ce script et tapez la commande

crontab -e

puis entrez

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

Redémarrez le système et voyez si cela fonctionne. Il y a un avantage par rapport à upstart, même s'il est démarré un peu plus tard, vous n'avez pas à vous soucier beaucoup des dépendances comme la mise en réseau, etc. pour être déjà opérationnel.

s1mmel
la source
Avez-vous une idée de la propreté d'un redémarrage?
Justin Smith
1
Désolé, mais ce n'est pas une très bonne réponse. Cela peut fonctionner de temps en temps, mais comme cron peut être chargé avant d'autres exigences de docker, vous rencontrez une condition de concurrence critique.
Otheus
2

En supposant que vous utilisez la version 2 des définitions Docker Compose en vous docker-compose.yml, vous pouvez effectuer les opérations suivantes:

Définir restart: alwaysainsi:

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

Référence: https://docs.docker.com/compose/compose-file/compose-file-v2/

Sergei Filippov
la source
1
La question est, à laquelle le site de docker ne répond pas, était: "Quelle est la bonne façon de démarrer docker-compose s'exécute toujours sans intervention manuelle?"
Otheus
0

Docker n'est pas prêt immédiatement Si vous exécutez le script trop tôt, rien ne se passera. Le docker commencera à répondre à la commande docker ps dès qu'il sera prêt afin que vous puissiez utiliser cette astuce dans crontab:

nano / etc / crontabs / root

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

Evgeny Savelov
la source