Utilisation de Docker-Compose, comment exécuter plusieurs commandes

Je veux faire quelque chose comme ça où je peux exécuter plusieurs commandes dans l’ordre.

db: image: postgres web: build: . command: python manage.py migrate command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" links: - db 

Figuré, utilisez bash -c .

Exemple:

 command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" 

Même exemple en multilignes:

 command: > bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" 

Je lance des tâches de pré-démarrage comme les migrations dans un conteneur éphémère séparé, comme ça (notez que le fichier de composition doit être de type “2”):

 db: image: postgres web: image: app command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" links: - db depends_on: - migration migration: build: . image: app command: python manage.py migrate volumes: - .:/code links: - db depends_on: - db 

Cela aide les choses à restr propres et séparées. Deux choses à considérer:

  1. Vous devez vous assurer que la séquence de démarrage est correcte (using profond_on)

  2. vous voulez éviter les constructions multiples qui sont obtenues en les marquant la première fois en utilisant build et image; vous pouvez vous référer à l’image dans d’autres conteneurs puis

Une autre idée:

Si, comme dans ce cas, vous construisez le conteneur, placez-y simplement un script de démarrage et exécutez-le avec la commande. Ou montez le script de démarrage en tant que volume.

Vous pouvez utiliser le point d’entrée ici. point d’entrée dans docker est exécuté avant la commande while tandis que la commande est la commande par défaut qui doit être exécutée au démarrage du conteneur. Ainsi, la plupart des applications utilisent généralement la procédure d’installation dans le fichier de point d’entrée et, en dernier, elles permettent l’exécution de la commande.

faire un fichier de script shell peut être comme docker-entrypoint.sh (le nom n’a pas d’importance) avec le contenu suivant.

 #!/bin/bash python manage.py migrate exec "$@" 

dans le fichier docker-compose.yml, utilisez le point d’ entrypoint: /docker-entrypoint.sh et enregistrez la commande comme command: python manage.py runserver 0.0.0.0:8000 PS: n’oubliez pas de copier docker-entrypoint.sh avec votre code .

Si vous devez exécuter plusieurs processus de démon, la documentation de Docker suggère d’utiliser Supervisord en mode détaché afin que tous les sous-démons soient envoyés vers la sortie standard.

À partir d’une autre question SO, j’ai découvert que vous pouvez redirect la sortie des processus enfants vers la sortie standard. De cette façon, vous pouvez voir toutes les sorties!

Utilisez un outil tel que wait-for-it ou dockerize . Ce sont de petits scripts d’encapsulation que vous pouvez inclure dans l’image de votre application. Ou écrivez votre propre script d’encapsulation pour exécuter d’autres commandes spécifiques à l’application. selon: https://docs.docker.com/compose/startup-order/

Bien que cela ne soit pas tout à fait pertinent pour la question, la poster ici au cas où cela aiderait quelqu’un. Si vous souhaitez exécuter une commande avant de démarrer le conteneur, vous pouvez exécuter le conteneur normalement. Ensuite, connectez-vous au conteneur et apportez les modifications. Vous pouvez ensuite valider le conteneur en tant que nouvelle image. Cette nouvelle image peut être utilisée pour garantir que toutes les modifications nécessaires existent avant de démarrer le conteneur.

essayez d’utiliser “;” séparer les commandes si vous êtes en version deux, par exemple

command: "sleep 20; echo 'a'"