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
238
demandé sur Rusty Shackleford 2015-05-06 00:53:37

9 réponses

Pensé à elle, l'utilisation bash -c.

Exemple:

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

Même exemple dans multilines:

command: >
    bash -c "python manage.py migrate
    && python manage.py runserver 0.0.0.0:8000"
475
répondu Rusty Shackleford 2018-01-22 23:50:49

J'exécute des choses de pré-démarrage comme les migrations dans un conteneur éphémère séparé, comme ceci (notez que le fichier de composition doit être de type version '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 à rester propres et séparées. Deux choses à considérer:

  1. Vous devez vous assurer de la séquence de démarrage correcte (en utilisant depends_on)

  2. Vous voulez éviter plusieurs builds qui est réalisé en le étiquetant la première fois en utilisant build et image; vous pouvez vous référer à image dans d'autres conteneurs alors

101
répondu Bjoern Stiel 2016-11-22 06:37:39

Une Autre idée:

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

16
répondu rweng 2015-07-09 19:30:50

Vous pouvez utiliser entrypoint ici. entrypoint dans docker est exécuté avant la commande 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 portent généralement la procédure d'installation dans le fichier entrypoint et dans le dernier, elles permettent à la commande de s'exécuter.

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 docker-composer.fichier YML l'utiliser avec entrypoint: /docker-entrypoint.sh et enregistrer la commande comme command: python manage.py runserver 0.0.0.0:8000 P. S : n' n'oubliez pas de copier docker-entrypoint.sh avec votre code.

14
répondu Harshad Yeola 2016-08-06 08:30:03

Si vous avez besoin d'exécuter plus d'un processus démon, il y a une suggestion dans la documentation Docker pour utiliser Supervisord dans un mode non détaché afin que tous les sous-démons sortent vers la sortie stdout.

D'une autre question SO, j'ai découvert que vous pouvez rediriger la sortie des processus enfants vers la sortie stdout. de cette façon, vous pouvez voir toutes les sorties!

1
répondu Tim Tisdall 2017-05-23 12:02:47

Utiliser un outil tel que wait-for-il ou dockerize. Ce sont de petits scripts wrapper que vous pouvez inclure dans l'image de votre application. Ou écrivez votre propre script wrapper pour effectuer une commande plus spécifique à l'application. selon: https://docs.docker.com/compose/startup-order/

1
répondu Eran 2016-07-11 11:46:55

Je recommande d'utiliser sh par opposition à bash car il est plus facilement disponible sur la plupart des images basées sur unix (alpine, etc.).

Voici un exemple docker-compose.yml:

version: '3'

services:
  app:
    build:
      context: .
    command: >
      sh -c "python manage.py wait_for_db &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"

Cela appellera les commandes suivantes dans l'ordre:

  • python manage.py wait_for_db - Attendez que la base de données soit prête
  • python manage.py migrate - exécuter toutes les migrations
  • python manage.py runserver 0.0.0.0:8000 - démarrer mon serveur de développement
1
répondu Mark Winterbottom 2018-10-04 07:41:51

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

-3
répondu user3229050 2017-11-17 16:44:41

Essayez d'utiliser ";" pour séparer les commandes, si vous êtes dans verions deux par exemple

command: "sleep 20; echo 'a'"

-6
répondu chanllen 2017-01-13 00:11:06