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
docker
yaml
docker-compose
RustyShackleford
la source
la source
/bin/bash
sh
plutôt:[sh, -c, "cd /usr/src/app && npm start"]
ash
en alpin :)J'exécute des trucs de pré-démarrage comme des migrations dans un conteneur éphémère séparé, comme ça (notez que le fichier de composition doit être de type '2'):
Cela aide à garder les choses propres et séparées. Deux choses à considérer:
Vous devez vous assurer de la séquence de démarrage correcte (en utilisant depend_on)
vous voulez éviter plusieurs builds ce qui est réalisé en le marquant la première fois en utilisant build et image; vous pouvez vous référer à l'image dans d'autres conteneurs puis
la source
bash -c
haut.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
:Cela appellera les commandes suivantes dans l'ordre:
python manage.py wait_for_db
- attendez que la base de données soit prêtepython manage.py migrate
- exécuter toutes les migrationspython manage.py runserver 0.0.0.0:8000
- démarrer mon serveur de développementla source
>
est utilisé pour démarrer une entrée multiligne (voir stackoverflow.com/a/3790497/2220370 )Cela fonctionne pour moi:
docker-compose essaie de déréférencer les variables avant d' exécuter la commande, donc si vous voulez que bash gère les variables, vous devrez échapper aux signes dollar en les doublant ...
... sinon vous obtiendrez une erreur:
la source
$${Types}
et$${Client}
. Je pense que cela empêchera Docker Composer d'interpréter ces variables et de rechercher leurs valeurs dans le shell à partir duquel vous appelez Docker-Composer, ce qui signifie qu'elles sont toujours là pour bash pour les déréférencer ( après que Docker a traité votre.env
fichier).Vous pouvez utiliser le point d'entrée ici. Le point d'entrée 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 comportent généralement une procédure de configuration dans un fichier de point d'entrée et, dans le 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.dans le fichier docker-compose.yml, utilisez-le avec
entrypoint: /docker-entrypoint.sh
et enregistrez la commande en tant quecommand: python manage.py runserver 0.0.0.0:8000
PS: n'oubliez pas de copierdocker-entrypoint.sh
avec votre code.la source
docker-compose run service-name ....
Une autre idée:
Si, comme dans ce cas, vous créez 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.
la source
#!/bin/bash \n python manage.py migrate \n python manage.py runserver 0.0.0.0:8000
(laid en ligne)* MISE À JOUR *
J'ai pensé que la meilleure façon d'exécuter certaines commandes est d'écrire un Dockerfile personnalisé qui fait tout ce que je veux avant que le CMD officiel ne soit exécuté à partir de l'image.
docker-compose.yaml:
Dockerfile.mongo:
C'est probablement la façon la plus propre de le faire.
* ANCIENNE VOIE *
J'ai créé un script shell avec mes commandes. Dans ce cas, je voulais démarrer
mongod
et exécuter,mongoimport
mais appelermongod
vous empêche d'exécuter le reste.docker-compose.yaml :
start_mongod.sh :
Donc, cette fourche mongo, fait de la monogimportation puis tue le mongo fourchu qui est détaché, et le redémarre sans se détacher. Je ne sais pas s'il existe un moyen de s'attacher à un processus fourchu, mais cela fonctionne.
REMARQUE: Si vous souhaitez strictement charger des données de base de données initiales, voici la façon de procéder:
mongo_import.sh
Les fichiers mongo_fixtures / *. json ont été créés via la commande mongoexport.
docker-compose.yaml
la source
Si vous devez exécuter plusieurs processus démon, il est suggéré dans la documentation Docker d'utiliser Supervisord en mode non détaché pour 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 rediriger la sortie des processus enfants vers la sortie standard. De cette façon, vous pouvez voir toutes les sorties!
la source
Pour exécuter plusieurs commandes dans le fichier docker-compose à l'aide de
bash -c
.Source: https://intellipaat.com/community/19590/docker-run-multiple-commands-using-docker-compose-at-once?show=19597#a19597
la source
Utilisez un outil tel que l'attendre 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 exécuter des commandes plus spécifiques à l'application. selon: https://docs.docker.com/compose/startup-order/
la source
J'ai rencontré cela en essayant de configurer mon conteneur jenkins pour créer des conteneurs docker en tant qu'utilisateur jenkins.
Je devais toucher le fichier docker.sock dans le Dockerfile car je le lierai plus tard dans le fichier docker-compose. Sauf si je l'ai touché en premier, il n'existait pas encore. Cela a fonctionné pour moi.
Dockerfile:
docker-compose.yml:
la source
essayez d'utiliser ";" pour séparer les commandes si vous êtes dans les versions deux, par exemple
command: "sleep 20; echo 'a'"
la source