Respuestas:
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 webbash
, sedocker-compose run web python app.py
anula conpython 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
:
Me gustaría señalar que si está utilizando Python con el depurador pdb:
import pdb; pdb.set_trace()
No caerá al shell si ejecuta su script usando:
docker-compose up
Sin embargo, si usa ejecutar, se desplegará al depurador como se esperaba:
docker-compose run
Hay una respuesta de docker docs .
Por lo general, quieres
docker-compose up
. Useup
para iniciar o reiniciar todos los servicios definidos en adocker-compose.yml
. En el modo "adjunto" predeterminado, verá todos los registros de todos los contenedores. En el modo "separado" (-d
), Compose sale después de iniciar los contenedores, pero los contenedores continúan ejecutándose en segundo plano.El
docker-compose run
comando es para ejecutar tareas "únicas" o "ad hoc". Requiere el nombre del servicio que desea ejecutar y solo inicia los contenedores para los servicios de los que depende el servicio en ejecución. Utilícelorun
para ejecutar pruebas o realizar una tarea administrativa, como eliminar o agregar datos a un contenedor de volumen de datos. Elrun
comando actúa de la misma maneradocker run -ti
que abre un terminal interactivo al contenedor y devuelve un estado de salida que coincide con el estado de salida del proceso en el contenedor.
docker-compose run
para ejecutar comandos contra un servicio en ejecución ydocker-compose up
para generar un nuevo servicio.