Cómo quitar viejos contenedores Docker

1235

Esta pregunta está relacionada con ¿Debería preocuparme el exceso de contenedores Docker que no funcionan? .

Me pregunto cómo quitar los contenedores viejos. El docker rm 3e552code34ale permite quitar una sola, pero tengo un montón ya. docker rm --helpno ofrece una opción de selección (como todas 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?

qkrijger
fuente
21
También debe considerar la limpieza de los volúmenes de Docker huérfanos. A menudo encuentro que consumen mucho más espacio que los contenedores antiguos y las imágenes antiguas. Un buen script para eliminar volúmenes de Docker huérfanos está disponible en: github.com/chadoe/docker-cleanup-volumes .
Nemanja Trifunovic
Quizás github.com/chadoe/docker-cleanup-volumes pueda ayudarlo.
Mihai8
También puede usar docker runcon el --rmindicador que haría que el contenedor sea efímero, eliminando todos los archivos del contenedor después de la ejecución.
Gordon
12
Con docker 1.13 (Q4 2016), también puede considerar el nuevo docker system prunecomando. Vea mi respuesta a continuación .
VonC
1
Utilice la herramienta de administración de acopladores Portainer Podemos administrar all the old containers, non using volumes and imagesmediante esta herramienta Es una interfaz de usuario de administración simple para los acopladores Please refer my update below on how to deploy the application
Anish Varghese

Respuestas:

1460

Desde Docker 1.13.x puede usar la poda de contenedores Docker :

docker container prune

Esto eliminará todos los contenedores detenidos y debería funcionar en todas las plataformas de la misma manera.

También hay una poda del sistema Docker :

docker system prune

que limpiará todos los contenedores no utilizados, redes, imágenes (colgantes y sin referencia) y, opcionalmente, volúmenes, en un solo comando.


Para versiones anteriores de Docker, puede encadenar 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 es debido, este ejemplo es de https://twitter.com/jpetazzo/status/347431091415703552 .

Ken Cochrane
fuente
92
Comando similar para eliminar todas las imágenes sin etiquetar: docker images | grep "<none>" | awk '{print $3}' | xargs docker rmi
Mohan Raj
77
@ MichelMüller al construir una imagen desde un dockerfile, puede especificar la -rmopción para eliminar contenedores intermedios después de una compilación exitosa.
Freek Kalter
3
@ MichelMüller las imágenes son las que se usan para el almacenamiento en caché, por lo que eliminar los contenedores no afectará eso.
Ken Cochrane
77
Si desea utilizar awk para esto, considere este comando si desea hacer todos los contenedores detenidos (sin error debido a la primera línea):docker ps -a | awk 'NR > 1 {print $1}' | xargs docker rm
masi
3
Este debería ser el comando actualizado para eliminar imágenes sin etiquetardocker rmi $(docker images -q -f dangling=true)
Ghjnut
626

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

Consulte PR 26108 y confirme 86de7c0 , que presenta algunos comandos nuevos para ayudar a facilitar la visualización de cuánto espacio ocupan los datos del demonio Docker en el disco y permite limpiar fácilmente el 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
qkrijger
fuente
11
esto de alguna manera no funciona para mí, pero docker ps -a -q | xargs docker rmfunciona (sudo puede ser necesario)
FUD
86
¿qué pasa docker rm $(docker ps -a -q)?
qkrijger
8
@qkrijger, esto no cambia nada de su respuesta original, excepto para agregar bashism. El problema es con el desbordamiento de la línea de comando. La variante xargs lo trata de una manera agradable. También agregaría --no-trunk a docker ps para evitar (poco probable) conflictos de id.
Ihor Kaharlichenko
8
Tenga en
44
No veo el punto --no-truncya docker rmque no necesita ID completos de todos modos.
Pithikos
411

Respuesta actualizada Use docker system pruneo docker container pruneahora. Ver la respuesta actualizada de VonC .

Respuesta anterior Al componer varias sugerencias diferentes anteriores, la forma 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 los contenedores salidos)
Ryan Walls
fuente
77
Esta debería ser la respuesta correcta porque se basa en Docker para decirle qué contenedores ya no se usan, en lugar de asumir que el formato de salida de texto de $ (imágenes de Docker) no cambiará. Puntos de bonificación por generar solo un proceso adicional en lugar de dos.
Euritmia
18
Es posible que desee añadir -vpara evitar colgando volúmenes: docker rm -v $(docker ps -q -f status=exited). Consulte docs.docker.com/userguide/dockervolumes/… para obtener detalles sobre los volúmenes colgantes.
rluba
@rluba aparentemente en Docker 1.9 habrá una API de volumen separada para manejar ese problema. github.com/docker/docker/pull/14242
Ryan Walls
un alias podría ser útil:alias docker-gc="docker rm -v \$(docker ps -q -f status=exited)"
Frank Neblung
A diferencia de la respuesta marcada como correcta, la respuesta de @RyanWalls funciona en OSX además de ser más concisa.
Ray
255

La forma oficial es:

docker rm `docker ps -aq`

Los mantenedores de Docker han indicado que no habrá un comando para esto, y usted compone los comandos así:

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

Michael Neale
fuente
66
Sin embargo, esta es una mala solución, porque también eliminará los contenedores de almacenamiento.
Sobrique
8
¿Qué quiere decir "contenedores de almacenamiento"? Si se refiere a contenedores de solo datos que alguna vez se usaron para mantener referencias a volúmenes de datos, esos ya no son necesarios debido a la disponibilidad de docker volumesubcomando y volúmenes con nombre.
L0j1k
Tenga en cuenta que esto no funcionará dentro de Windows Powershell. Para eso, esta es una mejor solución: stackoverflow.com/a/23674294/1150683
Bram Vanroy
@Sobrique Si no reaccionas, al menos debes eliminar tu comentario, es una tontería casi completa y dañina.
peterh - Restablece a Monica
128

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 prunesin -a eliminará (para imágenes) solamente colgando las imágenes o imágenes sin una etiqueta, como se ha comentado por smilebomb .

Consulte PR 26108 y confirme 86de7c0 , que presenta algunos comandos nuevos para ayudar a facilitar la visualización de cuánto espacio ocupan los datos del demonio Docker en el disco y permite limpiar fácilmente el 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 comenta wjv ,

También existe docker {container,image,volume,network} prune, que puede usarse para eliminar instancias no utilizadas de un solo tipo de objeto.

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

docker container prune
VonC
fuente
Gracias por compartir, para que esto se vuelva visible, te estoy citando en la respuesta que aparece arriba en el hilo
qkrijger
Como de costumbre, agregue la -fbandera para forzar la limpieza sin hacer preguntas.
Dirk
3
debe ser marcado como la respuesta correcta hoy en dia, la mayoría de la espalda justo encima estaban en el tiempo, pero que son demasiado complicados nodays
Eugen Mayer
De acuerdo, mucho más fácil últimamente, ¡arriba!
Maxim Geerinck
La descripción en el bloque de código es para docker system prune -a, que elimina las imágenes no utilizadas. docker system prunesolo elimina imágenes colgantes o imágenes sin etiqueta.
smilebomb
104

Ahora es posible usar el filtrado 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 ellos causará docker rmo docker rmiarrojará un error cuando no haya contenedores coincidentes. El viejo docker rm $(docker ps -aq)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 ~/.bashrco ~/.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 la respuesta de Ryan) por mencionar el nuevo psfiltrado.

caktux
fuente
2
Tenga en cuenta la verdadera ventaja de esto: no mata accidentalmente a los storagecontenedores.
Sobrique
3
También puede usar status=createdpara obtener los que no se están ejecutando y nunca se han ejecutado.
enderland
96

ACTUALIZADO 2019 (MÁS NUEVO)

docker container prune

Esta manera 2017 (ANTIGUA)

Para eliminar TODOS LOS CONTENEDORES DETENIDOS

docker rm $(docker ps -a -q)

Para eliminar TODOS LOS CONTENEDORES (DETENIDOS Y NO DETENIDOS)

docker rm  -f $(docker ps -a -q)
levi
fuente
3
rechazado, ya que esta no es la forma en que lo haces en 2017: whis sería docker volume/container/image prune, mira stackoverflow.com/a/39860665/3625317
Eugen Mayer el
66
votaron a favor para contrarrestar el voto a favor porque a) esta respuesta fue de 2016, yb) muchas personas no corren a la vanguardia.
interesado el
49

Retire todos los contenedores detenidos:

docker rm $(docker ps -a | grep Exited | awk '{print $1}')

Del comentario de pauk960 :

Desde la versión 1.3.0 puede usar filtros con docker ps, en lugar de grep Exitedusar docker ps -a -f status=exited. Y si lo usa -q, puede obtener ID de contenedor solo en lugar de la salida completa, no es necesario usar awk para eso.

Montells
fuente
33

Si no desea eliminar todos los contenedores, puede seleccionar todos los contenedores creados antes o después de un contenedor específico con docker ps --before <container-ID>o con docker ps --since <container-ID>. Esta característica es al menos en Docker versión 0.6.5.

Digamos que ha desarrollado su sistema y ahora está funcionando, pero quedan varios contenedores. Desea eliminar los contenedores creados antes de esa versión de trabajo. Determine la ID del contenedor de trabajo con docker ps.

Eliminar contenedores creados antes de otro contenedor

docker rm $(docker ps --before 9c49c11c8d21 -q)

Otro ejemplo. Ya tiene su base de datos ejecutándose en un contenedor Docker. Ha desarrollado su aplicación para ejecutarse en otro contenedor y ahora tiene varios contenedores innecesarios.

Eliminar contenedores creados después de cierto contenedor

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker almacena contenedores /var/lib/docker/containersen Ubuntu. Creo que los contenedores adicionales no causan ningún otro daño, pero ocupan espacio en disco.

vesako
fuente
32

Actualización: a partir de Docker versión 1.13 (lanzada en enero de 2017), puede emitir el siguiente comando para limpiar contenedores detenidos, volúmenes no utilizados, imágenes colgantes y redes no utilizadas:

docker system prune

Si desea asegurarse de que solo está eliminando contenedores que tienen un exitedestado, use esto:

docker ps -aq -f status=exited | xargs docker rm

Del mismo modo, si está limpiando cosas de la ventana acoplable, puede deshacerse de las imágenes sin etiqueta y sin nombre de esta manera:

docker images -q --no-trunc -f dangling=true | xargs docker rmi
L0j1k
fuente
22

Aquí está mi docker-cleanupscript, que elimina contenedores e imágenes sin etiquetar. Por favor, consulte la fuente para cualquier actualización.

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

Fuente: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup

azulado
fuente
@BradMurray ¡Gracias! También te pueden gustar estos: github.com/blueyed/dotfiles/commit/…
blueyed
3
No funciona en OSX debido a la xargs --no-run-if-emptyopción
caktux
13

Primero, deje de ejecutar contenedores antes de intentar eliminarlos

Eliminar contenedores en ejecución

docker rm $(docker stop -t=1 $(docker ps -q))

Podrías usar en killlugar de stop. En mi caso, prefiero stopya que tiendo a volver a ejecutarlos en lugar de crear uno nuevo cada vez, así que trato de cerrarlos bien.

Nota: Intentar detener un contenedor le dará un error:

Error: es imposible eliminar un contenedor en ejecución, deténgalo primero

Retire todos los contenedores

docker rm $(docker ps -a -q)
Ulises
fuente
11

Eliminar todos los contenedores del shell de Windows:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i
Bartosz Bilicki
fuente
Incluiré esto en mi respuesta ya que es la primera página. Gracias
qkrijger
"desde el shell de Windows" ? ¿Te refieres a "usar el shell de Windows (CMD)" ?
Peter Mortensen
10

https://github.com/HardySimpson/docker-cleanup

Limpieza de Docker

Una pequeña carcasa todo en uno, que elimina:

  • Contenedores que no funcionan hace más de un día
  • Imágenes que no pertenecen a ningún contenedor restante

Tiene la intención de ejecutarse como un trabajo crontab

Característica

  • Eliminará todas las <none>:<none>imágenes.
  • Si la imagen tiene múltiples referencias repo: tag a ella, eliminará todas las repo: tag excepto al ejecutar un contenedor. En realidad es una naturaleza de "docker rmi".
  • Se mostrarán muchos mensajes de error en la pantalla, y usted puede decidir si desea 2>/dev/nullo no
  • Aprenda algo de docker-gc y solucione su problema (no puede eliminar la imagen que tiene un repositorio múltiple: etiqueta)
HardySimpson
fuente
9

Por lo tanto, personalmente recomiendo hacer esto como parte de su script de implementación para imágenes y contenedores, manteniendo solo los n contenedores e imágenes más recientes. Etiqueto mis imágenes de Docker con el mismo esquema de versiones que utilizo git tagy siempre etiqueto la última imagen de Docker con "último". Esto significa que sin limpiar nada, mis imágenes de Docker terminan pareciendo:

REPOSITORY              TAG       IMAGE ID        CREATED         VIRTUAL SIZE
some_repo/some_image    0.0.5     8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    latest    8f1a7c7ba93c    23 hours ago    925.4 MB
some_repo/some_image    0.0.4     0beabfa514ea    45 hours ago    925.4 MB
some_repo/some_image    0.0.3     54302cd10bf2    6 days ago      978.5 MB
some_repo/some_image    0.0.2     0078b30f3d9a    7 days ago      978.5 MB
some_repo/some_image    0.0.1     sdfgdf0f3d9a    8 days ago      938.5 MB

Ahora, por supuesto, no quiero mantener todas mis imágenes (o contenedores) volviendo a perpetuidad en todas mis cajas de producción. Solo quiero los últimos 3 o 4 para retrocesos y deshacerme de todo lo demás. Unix tailes tu mejor amigo aquí. Desde docker imagesy docker psambos ordenados por fecha, podemos usar tailpara seleccionar todos menos los tres primeros y eliminarlos:

docker rmi $(docker images -q | tail -n +4)

Ejecútelo junto con sus scripts de implementación (o localmente) para mantener siempre las imágenes suficientes para retroceder cómodamente sin ocupar demasiado espacio o desordenar las imágenes antiguas.

Personalmente, solo mantengo un contenedor en mi caja de producción en cualquier momento, pero puedes hacer lo mismo con los contenedores si quieres más:

docker rm $(docker ps -aq | tail -n +4)

Finalmente, en mi ejemplo simplificado, solo estamos tratando con un repositorio a la vez, pero si tuviera más, puede volverse un poco más sofisticado con la misma idea. Digamos que solo quiero mantener las últimas tres imágenes de some_repo / some_image. Yo sólo puede mezclar en grepy awky estar en mi camino:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

Una vez más, la misma idea se aplica a los contenedores, pero ya lo entiendes, así que dejaré de dar ejemplos.

Eli
fuente
8

Utilizar:

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

Se detiene con fuerza y ​​elimina todos los contenedores presentes localmente.

Shashank G
fuente
Edite con más información. Se desaconsejan las respuestas de solo código y "pruebe esto", ya que no contienen contenido que se pueda buscar y no explican por qué alguien debería "probar esto". Hacemos un esfuerzo aquí para ser un recurso para el conocimiento.
Brian Tompsett - 汤 莱恩
En ubuntu 16.04, la ventana acoplable requiere sudo, por lo que debe escribir sudo docker rm -f $(sudo docker ps -a -q).
Elliott
como un plus, ¡esto también funciona en Windows bajo powershell!
Robert Ivanc
@Elliott, creo que sudoes necesario en todas partes a menos que agregue su usuario al grupo 'acoplador'. Uso ubuntu 16.10 sin sudo agregando mi usuario al grupo docker.
emory
7

Retire 5 contenedores más antiguos:

docker rm `docker ps -aq | tail -n 5`

Vea cuántos contenedores quedan:

docker ps -aq | wc -l
Pithikos
fuente
Buen trabajo @Pithikos. He agregado la respuesta que elimina todos los contenedores antiguos.
Mostafa Ghadimi
7

Retire todos los contenedores detenidos.

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

Esto eliminará todos los contenedores detenidos al obtener una lista de todos los contenedores con docker ps -a -q y pasar sus identificadores a docker rm. Esto no debería eliminar ningún contenedor en ejecución, y le dirá que no puede eliminar una imagen en ejecución.

Eliminar todas las imágenes sin etiquetar

Ahora desea limpiar imágenes antiguas para ahorrar espacio.

sudo docker rmi $ (imágenes de sudo docker -q --filter "colgando = verdadero")

Ric_Harvey
fuente
No olvide eliminar los volúmenes de Docker especificando la opción -v (sudo docker rm -v $ (sudo docker ps -a -q))
vcarel
No busqué esto, pero supongo lo mismo que:docker ps -aq | xargs docker rm -v
Quine
Esto solo funciona en Linux, no en Windows ... Pero docker rm -f $(docker ps -a -q)funciona en PowerShell / Docker para Windows.
Peter Mortensen
6

Nueva forma: spotify / docker-gc juega el truco.

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • Los contenedores que salieron hace más de una hora se eliminan.
  • Las imágenes que no pertenecen a ningún contenedor restante después de eso se eliminan

Ha soportado configuraciones ambientales

Forzar la eliminación de imágenes que tienen múltiples etiquetas

 FORCE_IMAGE_REMOVAL=1

Forzar la eliminación de contenedores

 FORCE_CONTAINER_REMOVAL=1 

Excluyendo contenedores e imágenes salidos recientemente de la recolección de basura

 GRACE_PERIOD_SECONDS=86400

Esta configuración también evita la eliminación de imágenes que se crearon hace menos de GRACE_PERIOD_SECONDS segundos.

Carrera en seco

 DRY_RUN=1

Limpieza de volúmenes de contenedores huérfanos CLEAN_UP_VOLUMES = 1

Referencia: docker-gc

Antigua forma de hacer:

eliminar contenedores antiguos que no se ejecutan

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

eliminar todas las imágenes asociadas con contenedores acoplables que no se ejecutan

 docker images -q | xargs --no-run-if-empty docker rmi

limpieza de volúmenes de Docker huérfanos para Docker versión 1.10.xy superior

 docker volume ls -qf dangling=true | xargs -r docker volume rm

Basado en el periodo de tiempo

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
f-sociedad
fuente
1
Alternativa interesante +1
VonC
6
  1. Eliminar todos los procesos de docker:

    docker rm $(docker ps -a -q)
    
  2. Eliminar contenedor específico:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    
padakpadak
fuente
4
#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done
mckoss
fuente
para aquellos que no quieren buscarlo ellos mismos github.com/spotify/docker-gc
sombrío
Es perfecto. También escribí una respuesta que tiene la misma funcionalidad.
Mostafa Ghadimi
3

Siempre uso docker rmi $(docker ps -a -q)para eliminar todas las imágenes.

Puede eliminar el directorio /var/lib/docker/graphcuando docker rmifalla.

soleado
fuente
Gracias por agregar la información / var / lib / docker / graph
Jonathan DeMarks
La pregunta era cómo eliminar contenedores, no imágenes.
pauk960
3

Solo puede eliminar los contenedores detenidos. Detenlos a todos al principio

docker stop $(docker ps -a -q)

Entonces puedes eliminar

docker rm $(docker ps -a -q)

Marcin Szymczak
fuente
3

Pruebe este comando para limpiar contenedores y colgar imágenes.

docker system prune -f
Camarada
fuente
¡Este es un increíble consejo profesional!
b01
3

Los pasos básicos para detener / eliminar todos los contenedores e imágenes

  1. Listar todos los contenedores

    docker ps -aq

  2. Detenga todos los contenedores en funcionamiento.

    docker stop $(docker ps -aq)

  3. Retire todos los contenedores

    docker rm $(docker ps -aq)

  4. Eliminar todas las imágenes

    docker rmi $(docker images -q)

Nota: Primero debe detener todos los contenedores en ejecución antes de eliminarlos. Además, antes de eliminar una imagen, debe detener y eliminar sus contenedores dependientes.

Murali Manchadikkal
fuente
2

Para cualquier persona interesada, tomé el ejemplo de qkrijger y lo convertí en un todo claro (detener y eliminar todo)

docker stop `docker ps --no-trunc -aq` ; docker rm `docker ps --no-trunc -aq`
Kraig McConaghy
fuente
Si de todos modos está retirando los contenedores, entonces docker rm -f $(docker ps --no-trunc -aq)es más rápido
qkrijger
Es cierto, pero si necesita pasar por el apagado adecuado para limpiar los recursos compartidos o reutilizados (es decir, volúmenes adjuntos, conexiones activas correctamente cerradas, etc.), primero debe llamar a detener. Gran ejemplo, si tienes un contenedor Jenkins, entonces matar el contenedor es una mala idea. Desea que guarde los cambios no persistentes, advierta a los usuarios registrados y, lo que es más importante, detenga correctamente todas las compilaciones.
Kraig McConaghy
acordado, ese es un caso de uso muy válido
qkrijger
2
#!/bin/bash

echo Cleanup unused containers
unused_containers=$(docker ps -a -q --filter="status=exited")
if [[ -n $unused_containers ]]
then
  docker rm $unused_containers
fi

echo Cleanup unused images
unused_images=$(docker images | grep '^<none>' | awk '{print $3}')
if [[ -n $unused_images ]]
then
  docker rmi $unused_images
fi
AleX
fuente
55
Cuando responda, es mejor tener alguna explicación sobre lo que hace la solución en lugar de solo un volcado de código, ya que de lo contrario la respuesta podría eliminarse.
AlBlue
2
docker rm --force `docker ps -qa`
Sivalingam
fuente
2

Estoy usando:

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

para eliminar contenedores salidos y:

docker rmi -f $(docker images | grep "<none>" | awk "{print \$3}")

para deshacerse de todas las imágenes sin etiquetar.

Alexandru Bantiuc
fuente