Tengo un docker-compose.ymlarchivo 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 restartcomandos NO aplicarán ningún cambio. "Si realiza cambios en sudocker-compose.ymlconfiguració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 -arestartque 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
upanterior). 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 installya 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-cacheopción? Digamos que agregué algo a mipackage.jsony necesito volver a hacerlo,RUN npm installpero elDockerfilemismo no ha cambiadoCOPYcomando, eso romperá el caché automáticamente.COPYcomando en su Dockerfile. Elgit pullactualizará el archivo package.json y la caché de construcción se romperá cuando se ve ventana acoplable se copia en un archivo diferente.ADDlugar de,COPYpero aparentemente esta última es una mejor práctica, ¡ así que lo intentaré!ADDtendrá el mismo resultado queCOPYen 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 --buildy reconstruirá todo y reiniciará los contenedores modificados. No es necesario detenerse primero, con tiempo de inactividad, y comandos separados para crear e iniciar.upsolo 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
rmopción de línea-fes útil (sin solicitud) y con el acoplador actualcreateystartse combina comoup(por lo que en total tenemos 3 comandos, no 4), y para laupopción-des ú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.ymly el servicio es trabajadorCaso de uso n.º 2: si el nombre del archivo es
sample.ymly el servicio es trabajadorPor defecto, docker-compose busca
docker-compose.ymlsi ejecutamos eldocker-composecomando, de lo contrario, tenemos una bandera para dar un nombre de archivo específico con-f [FILE_NAME].ymlfuente
El simple comando 'docker' no sabe nada sobre el contenedor 'trabajador'. Use un comando como este
docker-compose -f docker-compose.yml restart workerfuente
Reiniciar contenedor
Si solo desea reiniciar su contenedor:
docker-compose restart servicenamePiense en este comando como "simplemente reinicie el contenedor por su nombre", que es equivalente a
docker restartcomando.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 updetectará cambios y volverá a crear el contenedor.Como muchos otros mencionaron, si cambiaste el
docker-compose.ymlarchivo, el simple reinicio no aplicará esos cambios.Si copia su código dentro del contenedor en la etapa de compilación (al
DockerfileusarADDoCOPYcomandos), cada vez que el código cambia, debe reconstruir el contenedor (docker-compose build).Correlación a su código
docker-compose restartdebería funcionar perfectamente bien, si su código obtiene la ruta asignada en el contenedor por la directiva de volumen de estadocker-compose.ymlmanera: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