¿Debo usar docker-compose up o run?

129

¿Hay alguna razón para usar runpara iniciar un docker-compose.ymlarchivo o debería usarlo up?

Entiendo que runpuede iniciar un contenedor específico, pero me estoy refiriendo al caso en el que lo usa sin especificar un contenedor para que arranque todos sus contenedores yml.

Raif
fuente

Respuestas:

141

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.pyanula con python app.py.

La segunda diferencia es que el docker-compose runcomando 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 runestá 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 runen 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:

VonC
fuente
27

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
Quickinsights
fuente
7

Hay una respuesta de docker docs .

Por lo general, quieres docker-compose up. Use uppara iniciar o reiniciar todos los servicios definidos en a docker-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 runcomando 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ícelo run para ejecutar pruebas o realizar una tarea administrativa, como eliminar o agregar datos a un contenedor de volumen de datos. El runcomando actúa de la misma manera docker run -tique abre un terminal interactivo al contenedor y devuelve un estado de salida que coincide con el estado de salida del proceso en el contenedor.

Arrendajo
fuente
1
Esta debería ser la respuesta aceptada. Básicamente, se usa docker-compose runpara ejecutar comandos contra un servicio en ejecución y docker-compose uppara generar un nuevo servicio.
Goonerify 01 de