Tengo un docker-compose.yml
archivo que contiene 4 contenedores: redis, postgres, api, trabajador
Durante el desarrollo del trabajador, a menudo necesito reiniciarlo para aplicar los cambios. ¿Hay alguna buena manera de reiniciar un contenedor (por ejemplo worker
) sin reiniciar los otros contenedores?
docker
docker-compose
Bryan Chen
fuente
fuente
Respuestas:
Es muy simple: usa el comando:
Puede configurar el tiempo de espera para detener antes de matar el contenedor (en segundos)
Tenga en cuenta que esto reiniciará el contenedor pero sin reconstruirlo. Si desea aplicar sus cambios y luego reiniciar, eche un vistazo a las otras respuestas.
fuente
docker-compose restart
comandos NO aplicarán ningún cambio. "Si realiza cambios en sudocker-compose.yml
configuración, estos cambios no se reflejan después de ejecutar este comando". Por lo tanto usodocker-compose up -d --build
. docs.docker.com/compose/reference/restartdocker ps -a
restart
que no aplica cambios incluso si ya ejecutó unadocker-compose build <container name>
y esta es una respuesta incorrecta / que no funciona.Las otras respuestas a reiniciar un solo nodo dan en el blanco,
docker-compose restart worker
. Eso hará rebotar ese contenedor, pero no incluirá ningún cambio, incluso si lo reconstruyó por separado. Puede manualmentestop
,rm
,create
, ystart
, pero hay métodos mucho más fácil.Si ha actualizado su código, puede hacer la compilación y la recarga en un solo paso con:
Eso reconstruirá primero sus imágenes a partir de cualquier código modificado, lo que es rápido si no hay cambios, ya que la memoria caché se reutiliza. Y luego solo reemplaza los contenedores modificados. Si las imágenes descargadas son obsoletas, puede preceder el comando anterior con:
Para descargar cualquier imagen modificada primero (los contenedores no se reiniciarán hasta que ejecute un comando como el
up
anterior). Hacer una parada inicial es innecesario.Y para hacer esto solo para un solo servicio, siga el comando up o pull con los servicios que desea especificar, por ejemplo:
Aquí hay un ejemplo rápido de la primera opción, el Dockerfile está estructurado para mantener las partes del código que cambian con frecuencia cerca del final. De hecho, los requisitos se aplican por separado
pip install
ya que ese archivo rara vez cambia. Y como los contenedores nginx y redis estaban actualizados, no se reiniciaron. El tiempo total para todo el proceso fue inferior a 6 segundos:fuente
-no-cache
opción? Digamos que agregué algo a mipackage.json
y necesito volver a hacerlo,RUN npm install
pero elDockerfile
mismo no ha cambiadoCOPY
comando, eso romperá el caché automáticamente.COPY
comando en su Dockerfile. Elgit pull
actualizará el archivo package.json y la caché de construcción se romperá cuando se ve ventana acoplable se copia en un archivo diferente.ADD
lugar de,COPY
pero aparentemente esta última es una mejor práctica, ¡ así que lo intentaré!ADD
tendrá el mismo resultado queCOPY
en el busto de caché, pero (como se sugiere en el enlace de mejores prácticas) la mayoría no necesita las capacidades adicionales, por lo que ni siquiera me molesto en mencionarlo.Para reiniciar un servicio con cambios, estos son los pasos que realicé:
fuente
docker-compose up -d --build
y reconstruirá todo y reiniciará los contenedores modificados. No es necesario detenerse primero, con tiempo de inactividad, y comandos separados para crear e iniciar.up
solo recreará el contenedor que se había cambiado y, por lo tanto, necesitaba un reinicio.Siguiente comando
simplemente DETENDRÁ e INICIARÁ el contenedor. es decir, sin cargar ningún cambio desde docker-compose.xml
STOP es similar a hibernar en PC. Por lo tanto, stop / start no buscará ningún cambio realizado en el archivo de configuración. Para recargar desde la receta del contenedor (docker-compose.xml) necesitamos eliminar y crear el contenedor (analogía similar al reinicio de la PC)
Entonces los comandos serán los siguientes
fuente
rm
opción de línea-f
es útil (sin solicitud) y con el acoplador actualcreate
ystart
se combina comoup
(por lo que en total tenemos 3 comandos, no 4), y para laup
opción-d
es útil (la ejecución está en segundo plano).Reinicie el servicio con el archivo docker-compose
Caso de uso n. ° 1: si COMPOSE_FILE_NAME es
docker-compose.yml
y el servicio es trabajadorCaso de uso n.º 2: si el nombre del archivo es
sample.yml
y el servicio es trabajadorPor defecto, docker-compose busca
docker-compose.yml
si ejecutamos eldocker-compose
comando, de lo contrario, tenemos una bandera para dar un nombre de archivo específico con-f [FILE_NAME].yml
fuente
El simple comando 'docker' no sabe nada sobre el contenedor 'trabajador'. Use un comando como este
docker-compose -f docker-compose.yml restart worker
fuente
Reiniciar contenedor
Si solo desea reiniciar su contenedor:
docker-compose restart servicename
Piense en este comando como "simplemente reinicie el contenedor por su nombre", que es equivalente a
docker restart
comando.Tenga en cuenta las advertencias:
Si cambió las variables ENV, no se actualizarán en el contenedor. Debe detenerlo y comenzar de nuevo. O bien, el uso de un solo comando
docker-compose up
detectará cambios y volverá a crear el contenedor.Como muchos otros mencionaron, si cambiaste el
docker-compose.yml
archivo, el simple reinicio no aplicará esos cambios.Si copia su código dentro del contenedor en la etapa de compilación (al
Dockerfile
usarADD
oCOPY
comandos), cada vez que el código cambia, debe reconstruir el contenedor (docker-compose build
).Correlación a su código
docker-compose restart
debería funcionar perfectamente bien, si su código obtiene la ruta asignada en el contenedor por la directiva de volumen de estadocker-compose.yml
manera:Pero recomendaría usar la recarga de código en vivo, que probablemente sea proporcionada por su marco de elección en el modo DEPURACIÓN (alternativamente, puede buscar paquetes de recarga automática en el idioma de su elección). Agregar esto debería eliminar la necesidad de reiniciar el contenedor cada vez que cambie el código, en lugar de volver a cargar el proceso dentro.
fuente
Las respuestas aquí están hablando del reflejo del cambio en el archivo docker-compose.yml.
Pero, ¿qué pasa si quiero incorporar los cambios que he realizado en mi código, y creo que eso solo será posible reconstruyendo la imagen y que lo hago con los siguientes comandos?
1. parada del contenedor acoplable
2. extracción del contenedor acoplable
3. eliminación de la imagen del acoplador
4. vuelva a componer el contenedor
fuente