Pregunta Cómo eliminar los viejos contenedores Docker


Esta pregunta está relacionada con ¿Debería preocuparme por los contenedores Docker que no funcionan?.

Me pregunto cómo eliminar los contenedores viejos. los docker rm 3e552code34a te permite eliminar uno solo, pero ya tengo muchos. docker rm --help no da una opción de selección (como todos, o por nombre de imagen).

Tal vez hay un directorio en el que se almacenan estos contenedores donde puedo eliminarlos fácilmente de forma manual?


985
2018-06-21 13:41


origen


Respuestas:


Hay una nueva característica en Docker 1.13.x llamado Docker contenedor podar: docker container prune

Esto hará lo que quieras y debería funcionar en todas las plataformas de la misma manera.

También hay una Docker system podar: docker system prune, que limpiará contenedores, imágenes, volúmenes y redes, todo en un solo comando.

Respuesta Original:

Se ha hablado de un comando de limpieza Docker. Puede encontrar la información en este ticket: Implementar un comando 'limpiar' (# 928)

Hasta que ese comando esté disponible, puede enhebrar los comandos de Docker junto con otros comandos de Unix para obtener lo que necesita. Aquí hay un ejemplo sobre cómo limpiar contenedores viejos que tienen semanas de antigüedad:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

Para dar crédito, donde corresponde, este ejemplo es de https://twitter.com/jpetazzo/status/347431091415703552.


1100
2018-06-21 14:25



Otro método, que obtuve de Guillaume J. Charmes (crédito donde es debido):

docker rm `docker ps --no-trunc -aq`

eliminará todos los contenedores de una manera elegante.

Y por Bartosz Bilicki, para Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

Para PowerShell:

docker rm @(docker ps -aq)

Una actualización con Docker 1.13 (Q4 2016), crédito a VonC (más adelante en este hilo)

docker system prune eliminará TODOS los datos no utilizados (es decir, en orden: contenedores detenidos, volúmenes sin contenedores e imágenes sin contenedores).

Ver PR 26108 y cometer 86de7c0, que están introduciendo algunos comandos nuevos para ayudar a facilitar la visualización de cuánto espacio están tomando los datos del daemon Docker en el disco y permitir una limpieza fácil del exceso "innecesario".

docker system prune

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

579
2017-08-09 06:41



Respuesta actualizada Utilizar docker system prune o docker container prune ahora. Ver Respuesta actualizada de VonC.

Respuesta anterior Componiendo varias sugerencias diferentes arriba, la manera más elegante de eliminar todos los contenedores que no se ejecutan parece ser:

docker rm $(docker ps -q -f status=exited)

  • -q imprime solo los identificadores del contenedor (sin encabezados de columna)
  • -f le permite filtrar su lista de contenedores impresos (en este caso, estamos filtrando para mostrar solo contenedores retirados)

385
2018-04-06 15:34



La forma oficial es:

docker rm `docker ps -aq`

Los mantenedores de Docker han indicado que no habrá ningún comando para esto, y usted redacta los comandos de esa manera:

Hemos discutido esto antes y preferimos que los usuarios usen la línea anterior sin tener que agregar código adicional a Docker.


241
2018-06-18 04:23



Con Docker 1.13 (cuarto trimestre de 2016), ahora tiene:

docker system prune -a eliminará TODOS los datos no utilizados (es decir, en orden: contenedores detenidos, volúmenes sin contenedores e imágenes sin contenedores).

docker system prune sin -a eliminará (para las imágenes) solo imágenes colgantes, o imágenes sin etiqueta, como comentado por Sonámbulo.

Ver PR 26108 y cometer 86de7c0, que están introduciendo algunos comandos nuevos para ayudar a facilitar la visualización de cuánto espacio están tomando los datos del daemon Docker en el disco y permitir una limpieza fácil del exceso "innecesario".

docker system prune -a

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N] y

Como wjv comentarios,

También hay docker {container,image,volume,network} prune, que se puede usar para eliminar instancias no utilizadas de solo uno tipo de objeto

Introducido en cometer 913e5cb, solo para Docker 1.13+.

docker container prune

104
2017-10-04 19:51



Ahora es posible usar filtración con docker ps:

docker rm $(docker ps -q -f status=exited)

Y para imágenes:

docker rmi $(docker images -q -f "dangling=true")

Sin embargo, cualquiera de esos causará docker rm o docker rmi lanzar un error cuando no hay contenedores coincidentes. El mas viejo docker rm $(docker ps -aq) El truco fue aún peor ya que trató de eliminar cualquier contenedor en ejecución, fallando en cada uno.

Aquí hay un script más limpio para agregar en su ~/.bashrc o ~/.profile :

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

Editar: Como se indica a continuación, la respuesta original fue para eliminar imágenes, no contenedores. Actualizado para responder a ambos, incluidos nuevos enlaces a la documentación. Gracias a Adrian (y a la respuesta de Ryan) por mencionar el nuevo ps filtración.


100
2018-06-23 02:07



ACTUALIZADO  2017 (EL MÁS NUEVO)

docker container prune

Esta - 2017 (Vieja forma

Para eliminar TODOS LOS CONTENEDORES DETENIDOS 

docker rm $(docker ps -a -q)

Para eliminar TODOS LOS CONTENEDORES  (DETENIDO Y NO DETENIDO)

docker rm  -f $(docker ps -a -q)

87
2017-08-08 20:37