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.py
remplace par python app.py
.
La deuxième différence est que la docker-compose run
commande 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 run
est 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
:
docker-compose run
pour exécuter des commandes sur un service en cours d'exécution etdocker-compose up
pour générer un nouveau service.