Como se menciona en docker-compose run
(2015)
El comando pasado por ejecución anula el comando definido en la configuración del servicio .
Por ejemplo, si se inicia la configuración del servicio web bash
, se docker-compose run web python app.py
anula con python app.py
.
La segunda diferencia es que el docker-compose run
comando no crea ninguno de los puertos especificados en la configuración del servicio .
Esto evita las colisiones de puertos con puertos ya abiertos. Si desea que los puertos del servicio se creen y se asignen al host, especifique el indicador --service-ports:
$ docker-compose run --service-ports web python manage.py shell
Entonces, a menos que tenga esas necesidades específicas (anular un comando o ejecutar solo un contenedor en diferentes puertos), docker-compose up
(incluso para un contenedor) es suficiente.
¿Puede ayudar a explicar por qué o cuándo no desea que se creen los puertos? Es por eso o cuándo pueden entrar en conflicto con puertos ya abiertos
Simplemente porque docker-compose run
está hecho para ejecutar comandos únicos para sus servicios.
Eso significa que, si ya lo hizo docker-compose up
, todos sus contenedores ya se están ejecutando en sus puertos especificados docker-compose.yml
.
Hacer un docker-compose run
en esta etapa (para ejecutar un comando único), si respetaba el mismo puerto, fallaría inmediatamente. De ahí la no creación predeterminada de esos puertos.
Otro caso de uso (en la referencia de variables de entorno Compose ):
Para ver qué variables de entorno están disponibles para un servicio, ejecute docker-compose run SERVICE env
.
La versión más reciente (2019+) de esos comandos está en docker/docker.github.io
:
docker-compose run
para ejecutar comandos contra un servicio en ejecución ydocker-compose up
para generar un nuevo servicio.