¿Cómo reconstruir el contenedor docker en docker-compose.yml?

218

Hay un alcance de servicios que se define en docker-compose.yml. Estos servicios se han iniciado. Necesito reconstruir solo uno de estos y comenzarlo sin otros servicios. Ejecuto los siguientes comandos:

docker-compose up -d # run all services
docker-compose stop nginx # stop only one. but it still running !!!
docker-compose build --no-cache nginx 
docker-compose up -d --no-deps # link nginx to other services

Al final obtuve el viejo contenedor nginx. Por cierto, docker-compose no mata todos los contenedores en ejecución.

yuklia
fuente
44
docker-compose up --build
Jinna Balu

Respuestas:

234

docker-componer

$docker-compose up -d --no-deps --build <service_name>

--no-deps - No inicie servicios vinculados.

--build - Construye imágenes antes de iniciar contenedores.

denov
fuente
19
docker-compose build service1 service2 --no-cache funciona mejor ( github.com/docker/compose/issues/1049 ). Tuve un problema con los contenedores en caché que se construyeron antes de usarlos docker-compose up -d --no-deps --build <service_name>
evgpisarchik
33
@evgpisarchik Las órdenes un poco fuera, debería serdocker-compose build --no-cache service1 service2
Matthew Wilcoxson
184

Con docker-compose 1.19 up

docker-compose up --build --force-recreate --no-deps [-d] [<service_name>..]

Sin uno o más service_nameargumentos, todos los contenedores serán reconstruidos

Desde el menú de ayuda

Options:
    -d, --detach        Detached mode: Run containers in the background,
                        print new container names. Incompatible with
                        --abort-on-container-exit.
    --no-deps           Don't start linked services.
    --force-recreate    Recreate containers even if their configuration
                        and image haven't changed.
    --build             Build images before starting containers.
Harlem Ardilla
fuente
44
Estoy confundido sobre cómo esto responde la pregunta. ¿Cómo reconstruimos solo un contenedor?
Duncan Jones
11
Puede reconstruir solo un contenedor agregando su nombre al final del comando. docker-compose up -d --force-recreate --build container_name
HarlemSquirrel
Espere un segundo, esto recrea el contenedor , no es equivalente a la build --no-cacheopción, a menos que la descripción del comando sea completamente incorrecta
Slav
67

Esto debería solucionar su problema:

docker-compose ps # lists all services (id, name)
docker-compose stop <id/name> #this will stop only the selected container
docker-compose rm <id/name> # this will remove the docker container permanently 
docker-compose up # builds/rebuilds all not already built container 
ArgonQQ
fuente
12
si quieres stopy rmtodos los contenedores, entonces puedes usar el comando docker-compose down. Su solución es mejor si solo quiere deshacerse de algunos.
hirowatari
Esta solución es una buena opción para la configuración en la que no desea detener toda la aplicación acoplable y simplemente recrear uno de los servicios
bluesummers el
Necesitaba ejecutar docker-compose build <id/name>antes uppara reconstruir el Dockerfile modificado.
Vajk Hermecz
50

Como publicó @HarlemSquirrel, es la mejor y creo que la solución correcta.

Pero, para responder al problema específico de OP, debería ser algo como el siguiente comando, ya que no quiere recrear TODOS los servicios en el docker-compose.ymlarchivo, sino solo el nginxuno:

docker-compose up -d --force-recreate --no-deps --build nginx

Descripción de las opciones:

Options:
  -d                  Detached mode: Run containers in the background,
                      print new container names. Incompatible with
                      --abort-on-container-exit.
  --force-recreate    Recreate containers even if their configuration
                      and image haven't changed.
  --build             Build images before starting containers.
  --no-deps           Don't start linked services.
Slavik Meltser
fuente
11

Tal vez estos pasos no sean del todo correctos, pero me gusta esto:

detener docker componer: $ docker-compose down

retire el contenedor: $ docker system prune -a

iniciar docker componer: $ docker-compose up -d

Sergey Ivchenko
fuente
Práctico para limpiar toda la basura que recoges ...
jvenema
4

Simplemente use:

docker-compose build [yml_service_name]

Reemplace [yml_service_name]con su nombre de servicio en el docker-compose.ymlarchivo. Puede usar docker-compose restartpara asegurarse de que se realicen los cambios. Puedes usar --no-cachepara ignorar el caché.

FarhadMohseni
fuente
2

El problema es:

$ docker-compose stop nginx

no funcionó (dijiste que todavía se está ejecutando). Si vas a reconstruirlo de todos modos, puedes intentar matarlo:

$ docker-compose kill nginx

Si aún no funciona, intente detenerlo directamente con Docker:

$ docker stop nginx

o eliminarlo

$ docker rm -f nginx

Si eso todavía no funciona, verifique su versión de Docker, es posible que desee actualizar.

Puede ser un error, puede verificar si uno coincide con su sistema / versión. Aquí hay una pareja, por ejemplo: https://github.com/docker/docker/issues/10589

https://github.com/docker/docker/issues/12738

Como solución alternativa, podría intentar matar el proceso.

$ ps aux | grep docker 
$ kill 225654 # example process id
usuario2707671
fuente
1

Para mí, solo obtuvo nuevas dependencias de Docker Hub con ambos --no-cachey --pull(que están disponibles para docker-compose build.

# other steps before rebuild
docker-compose build --no-cache --pull nginx # rebuild nginx
# other steps after rebuild, e.g. up (see other answers)
kmindi
fuente
0
docker-compose stop nginx # stop if running
docker-compose rm -f nginx # remove without confirmation
docker-compose build nginx # build
docker-compose up -d nginx # create and start in background

Retirar el recipiente con rm es esencial. Sin quitar, Docker iniciará el contenedor viejo.

Nex
fuente
-9

Solamente:

$ docker-compose restart [yml_service_name]
ALEXANDER GOMEZ HIGUITA
fuente
44
Esto no generará nuevos cambios. del manual: si realiza cambios en la configuración de docker-compose.yml, estos cambios no se reflejarán después de ejecutar este comando.
denov