Cómo reiniciar un solo contenedor con docker-compose

333

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?

Bryan Chen
fuente
2
docker-compose -f docker-compose.yml reiniciar trabajador
Jinna Balu

Respuestas:

398

Es muy simple: usa el comando:

docker-compose restart worker

Puede configurar el tiempo de espera para detener antes de matar el contenedor (en segundos)

docker-compose restart -t 30 worker

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.

bmkrio
fuente
3
para mí funcionó, pero una pregunta general si está permitida aquí: ¿el 'reinicio' se ocupa de los contenedores vinculados y actualiza los / etc / hosts o un 'reinicio' no cambia ninguna IP?
michabbb
Los contenedores están vinculados por nombre y, por lo general, la única IP de la que debe preocuparse es la IP del host de la ventana acoplable externa (generalmente 192.168.99.100). Donde puede haber algún problema es si, por ejemplo, reinicia un contenedor de base de datos al que están conectados otros contenedores. Los contenedores dependientes deberán ser lo suficientemente resistentes como para volver a conectarse.
Ryan Kimber el
20
El OP afirma que necesita "reiniciarlo para aplicar los cambios". Según los documentos, los docker-compose restartcomandos NO aplicarán ningún cambio. "Si realiza cambios en su docker-compose.ymlconfiguración, estos cambios no se reflejan después de ejecutar este comando". Por lo tanto uso docker-compose up -d --build. docs.docker.com/compose/reference/restart
featherbelly
55
nb, trabajador es el nombre que recibe el servicio en el archivo YAML, y no todo lo que se ve cuando se ejecutadocker ps -a
WORC
2
Esta otra respuesta es mucho mejor stackoverflow.com/a/39501539/292408 , ya restartque no aplica cambios incluso si ya ejecutó una docker-compose build <container name>y esta es una respuesta incorrecta / que no funciona.
Elijah Lynn
170

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 manualmente stop, 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:

docker-compose up --detach --build

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:

docker-compose pull

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:

docker-compose up --detach --build worker

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:

$ time docker-compose -f docker-compose.nginx-proxy.yml up --detach --build
Building counter
Step 1 : FROM python:2.7-alpine
 ---> fc479af56697
Step 2 : WORKDIR /app
 ---> Using cache
 ---> d04d0d6d98f1
Step 3 : ADD requirements.txt /app/requirements.txt
 ---> Using cache
 ---> 9c4e311f3f0c
Step 4 : RUN pip install -r requirements.txt
 ---> Using cache
 ---> 85b878795479
Step 5 : ADD . /app
 ---> 63e3d4e6b539
Removing intermediate container 9af53c35d8fe
Step 6 : EXPOSE 80
 ---> Running in a5b3d3f80cd4
 ---> 4ce3750610a9
Removing intermediate container a5b3d3f80cd4
Step 7 : CMD gunicorn app:app -b 0.0.0.0:80 --log-file - --access-logfile - --workers 4 --keep-alive 0
 ---> Running in 0d69957bda4c
 ---> d41ff1635cb7
Removing intermediate container 0d69957bda4c
Successfully built d41ff1635cb7
counter_nginx_1 is up-to-date
counter_redis_1 is up-to-date
Recreating counter_counter_1

real    0m5.959s
user    0m0.508s
sys     0m0.076s
BMitch
fuente
Esto es interesante, pero ¿podría usarse junto con la -no-cacheopción? Digamos que agregué algo a mi package.jsony necesito volver a hacerlo, RUN npm installpero el Dockerfilemismo no ha cambiado
Augustin Riedinger
2
@augustinriedinger Si su archivo de entrada se cambia y lo incluye con un COPYcomando, eso romperá el caché automáticamente.
BMitch
1
@augustinriedinger gracias. Soy móvil, así que no puedo ver las preguntas vinculadas. De los pasos en su pregunta, ya debería tener un COPYcomando en su Dockerfile. El git pullactualizará el archivo package.json y la caché de construcción se romperá cuando se ve ventana acoplable se copia en un archivo diferente.
BMitch
1
Gracias no sabía sobre este comportamiento! Estaba usando en ADDlugar de, COPYpero aparentemente esta última es una mejor práctica, ¡ así que lo intentaré!
Augustin Riedinger
1
@augustinriedinger ADDtendrá el mismo resultado que COPYen 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.
BMitch
28

Para reiniciar un servicio con cambios, estos son los pasos que realicé:

docker-compose stop -t 1 worker
docker-compose build worker
docker-compose create worker
docker-compose start worker
Jeff
fuente
10
Si necesita cambios para aplicar con una compilación, puede hacer fácilmente 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.
BMitch
44
Sí, si desea reiniciar todos los servicios, pero el OP solo quiere reiniciar un solo servicio y no reiniciar los otros
Jeff
3
Vea la respuesta que publiqué, en el ejemplo, upsolo recreará el contenedor que se había cambiado y, por lo tanto, necesitaba un reinicio.
BMitch
18

Siguiente comando

docker-compose restart worker

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

docker-compose stop worker       // go to hibernate
docker-compose rm worker        // shutdown the PC 
docker-compose create worker     // create the container from image and put it in hibernate

docker-compose start worker //bring container to life from hibernation
Sr. codificador
fuente
+1, muchas gracias! Para la rmopción de línea -fes útil (sin solicitud) y con el acoplador actual createy startse combina como up(por lo que en total tenemos 3 comandos, no 4), y para la upopción -des útil (la ejecución está en segundo plano).
astrowalker
10

Reinicie el servicio con el archivo docker-compose

docker-compose -f [COMPOSE_FILE_NAME].yml restart [SERVICE_NAME]

Caso de uso n. ° 1: si COMPOSE_FILE_NAME es docker-compose.ymly el servicio es trabajador

docker-compose restart worker

Caso de uso n.º 2: si el nombre del archivo es sample.ymly el servicio es trabajador

docker-compose -f sample.yml restart worker

Por defecto, docker-compose busca docker-compose.ymlsi ejecutamos el docker-composecomando, de lo contrario, tenemos una bandera para dar un nombre de archivo específico con-f [FILE_NAME].yml

Jinna Balu
fuente
7

El simple comando 'docker' no sabe nada sobre el contenedor 'trabajador'. Use un comando como este

docker-compose -f docker-compose.yml restart worker

Shtlzut
fuente
44
no funciona - nuevos cambios en el coker-compose.yml no se aplicaron al reiniciar
jlee
3

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:

  1. 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.

  2. Como muchos otros mencionaron, si cambiaste el docker-compose.ymlarchivo, el simple reinicio no aplicará esos cambios.

  3. Si copia su código dentro del contenedor en la etapa de compilación (al Dockerfileusar ADDo COPYcomandos), 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 esta docker-compose.ymlmanera:

services:

  servicename:
    volumes:
      - .:/code

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.

Lev Rubel
fuente
1

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

docker stop container-id

2. extracción del contenedor acoplable

docker rm container-id

3. eliminación de la imagen del acoplador

docker rmi image-id

4. vuelva a componer el contenedor

docker-compose up container-name
Anshul Sharma
fuente