Dois-je utiliser docker-compose up ou exécuter?

129

Y a-t-il une raison à utiliser runpour démarrer un docker-compose.ymlfichier ou devez-vous simplement l'utiliser up?

Je comprends que cela runpeut démarrer un conteneur spécifique, mais je fais référence au cas où vous l'utilisez sans spécifier de conteneur afin qu'il démarre tous vos conteneurs yml.

Raif
la source

Réponses:

141

Comme mentionné dans docker-compose run(2015)

La commande passée par run remplace la commande définie dans la configuration du service .
Par exemple, si la configuration du service Web est démarrée avec bash, la docker-compose run web python app.pyremplace par python app.py.

La deuxième différence est que la docker-compose runcommande ne crée aucun des ports spécifiés dans la configuration du service .
Cela évite les collisions de ports avec des ports déjà ouverts. Si vous voulez que les ports du service soient créés et mappés à l'hôte, spécifiez l'indicateur --service-ports:

$ docker-compose run --service-ports web python manage.py shell

Donc, à moins que vous n'ayez ces besoins spécifiques (remplacer une commande ou exécuter un seul conteneur sur différents ports), docker-compose up(même pour un conteneur) suffit.

Pouvez-vous expliquer pourquoi ou quand vous ne voudriez pas que les ports soient créés? C'est pourquoi ou quand ils peuvent entrer en conflit avec des ports déjà ouverts

Tout simplement parce qu'il docker-compose runest fait pour exécuter des commandes ponctuelles pour vos services.
Cela signifie que, si vous avez déjà fait un docker-compose up, tous vos conteneurs sont déjà en cours d'exécution sur leurs ports spécifiés à partir de docker-compose.yml.
Faire un docker-compose runà ce stade (pour exécuter une commande ponctuelle), s'il respectait le même port, échouerait immédiatement. D'où la non-création par défaut de ces ports.


Un autre cas d'utilisation (dans la référence des variables d'environnement Compose ):

Pour voir quelles variables d'environnement sont disponibles pour un service, exécutez docker-compose run SERVICE env.


La version la plus récente (2019+) de ces commandes est sur docker/docker.github.io:

VonC
la source
27

Je tiens à souligner que si vous utilisez Python avec le débogueur pdb:

import pdb; pdb.set_trace()

Il ne tombera pas dans le shell si vous exécutez votre script en utilisant:

docker-compose up

Cependant, si vous utilisez run, il tombera dans le débogueur comme prévu:

docker-compose run
quickinsights
la source
7

Il y a une réponse des docs docker .

En règle générale, vous voulez docker-compose up. Utilisez uppour démarrer ou redémarrer tous les services définis dans un fichier docker-compose.yml. Dans le mode «attaché» par défaut, vous voyez tous les journaux de tous les conteneurs. En mode «détaché» ( -d), Compose se ferme après le démarrage des conteneurs, mais les conteneurs continuent à s'exécuter en arrière-plan.

La docker-compose runcommande sert à exécuter des tâches «ponctuelles» ou «adhoc». Il nécessite le nom du service que vous souhaitez exécuter et démarre uniquement les conteneurs pour les services dont dépend le service en cours d'exécution. Permet run d'exécuter des tests ou d'effectuer une tâche administrative telle que la suppression ou l'ajout de données à un conteneur de volume de données. La runcommande agit comme docker run -tisi elle ouvre un terminal interactif au conteneur et renvoie un état de sortie correspondant à l'état de sortie du processus dans le conteneur.

Geai
la source
1
Cela devrait être la réponse acceptée. Fondamentalement, utilisez docker-compose runpour exécuter des commandes sur un service en cours d'exécution et docker-compose uppour générer un nouveau service.
goonerify le