tag run remove name hub dockers container change docker

run - docker tag



Cómo quitar los viejos contenedores Docker (30)

Eliminar todos los contenedores creados a partir de una determinada imagen:

docker rm $(docker ps -a | awk ''/myimage:mytag/{print $1}'')

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

Me pregunto cómo quitar los contenedores viejos. La docker rm 3e552code34a permite eliminar una sola, pero ya tengo muchas. docker rm --help no da 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.


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

  1. Listar todos los contenedores

    docker ps -aq

  2. Detener todos los contenedores en ejecución

    docker stop $(docker ps -aq)

  3. Quitar todos los contenedores

    docker rm $(docker ps -aq)

  4. Eliminar todas las imagenes

    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.


  1. Eliminar todos los procesos de la ventana acoplable:

    docker rm $(docker ps -a -q)

  2. Retire el contenedor específico:

    $ docker ps -a (lists all old containers) $ docker rm container-Id


Ahora es posible utilizar el filtering con el docker ps :

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

Y para las images :

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

Sin embargo, cualquiera de ellos provocará que docker rm o docker rmi un error cuando no haya contenedores coincidentes. El truco anterior docker rm $(docker ps -aq) 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 tu ~/.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 }

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


Aquí está mi script de docker-cleanup , que elimina contenedores e imágenes sin etiquetar. Por favor, consulte la fuente para las actualizaciones.

#!/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


Con Docker 1.13 (Q4 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 las imágenes colgantes, o las imágenes sin etiqueta, como lo commented smilebomb .

Vea PR 26108 y commit 86de7c0 , que están introduciendo algunos comandos nuevos para ayudar a facilitar la visualización de la cantidad de espacio que los datos del demonio Docker están tomando en el disco y permiten 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 wjv comenta,

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

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

docker container prune


Eliminando todos los contenedores del shell de Windows:

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


Hay una nueva característica en Docker 1.13.x llamada poda de contenedor Docker : docker container prune

Esto hará lo que quieras 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á contenedores, imágenes, volúmenes y redes, todo en un solo comando.

Respuesta original:

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

Hasta que ese comando esté disponible, puede enlazar los comandos de Docker junto con otros comandos de Unix para obtener lo que necesita. Aquí hay un ejemplo sobre cómo limpiar los 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, cuando sea necesario, este ejemplo es de https://twitter.com/jpetazzo/status/347431091415703552 .


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

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

Se eliminarán 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 para 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).

Vea PR 26108 y commit 86de7c0 , que están introduciendo algunos comandos nuevos para ayudar a facilitar la visualización de la cantidad de espacio que los datos del demonio Docker están tomando en el disco y permiten 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


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

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


Para remover TODOS los recipientes sin llanto:

sudo docker ps -a | grep -v CONTAINER | awk ''{print $1}'' | xargs --no-run-if-empty sudo docker rm -f


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 versión que uso con la git tag y siempre etiquetando la última imagen de Docker con "más reciente". 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 que todas mis imágenes (o contenedores) vuelvan a perpetuidad en todas mis cajas de producción. Solo quiero los últimos 3 o 4 para revertir y deshacerme de todo lo demás. La tail de Unix es tu mejor amiga aquí. Ya que las docker images y la docker ps ordenan por fecha, solo podemos usar la tail para seleccionar a todos menos a los tres primeros y eliminarlos:

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

Ejecute eso 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 abarrotar cosas con imágenes antiguas.

Personalmente, solo guardo 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 tratamos con un repositorio a la vez, pero si tiene más, puede ser un poco más sofisticado con la misma idea. Digamos que solo quiero mantener las últimas tres imágenes de some_repo / some_image. Solo puedo mezclar grep y awk y awk 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 la obtienes para este punto, así que dejaré de dar ejemplos.


Primero, deja de correr los contenedores antes de intentar eliminarlos.

Retire los contenedores que corren

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

Podrías usar kill lugar de stop . En mi caso, prefiero stop ya que tiendo 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: Imposible eliminar un contenedor en ejecución, deténgalo primero

Quitar todos los contenedores

docker rm $(docker ps -a -q)


Pruebe este comando para limpiar los contenedores y las imágenes colgantes.

docker system prune -f


Puede eliminar solo los contenedores detenidos. Detenlos todos al principio

docker stop $(docker ps -a -q)

A continuación, puede eliminar

docker rm $(docker ps -a -q)



Retire los 5 contenedores más antiguos:

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

Vea cuántos contenedores quedan:

docker ps -aq | wc -l


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 la docker ps , en lugar de grep Exited use la grep Exited docker ps -a -f status=exited . Y si usa -q con él, puede obtener ID de contenedor solo en lugar de la salida completa, sin necesidad de usar awk para eso.


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 está al menos en la versión 0.6.5 de Docker.

Digamos que usted 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 la docker ps .

Retire los contenedores creados antes que otro contenedor.

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

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

Eliminar los contenedores creados después de un determinado contenedor.

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

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


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

Puede eliminar el directorio /var/lib/docker/graph cuando el docker rmi falló.


Utilizar:

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

Detiene a la fuerza y ​​elimina todos los contenedores presentes localmente.


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

Limpieza de la plataforma

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

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

La intención de ejecutar como un trabajo crontab

Característica

  • Se eliminarán todas las imágenes <none>:<none>
  • Si la imagen tiene varias referencias de etiqueta de repo: a ella, eliminará todas las etiquetas de repo: excepto con la ejecución de un contenedor. En realidad, es una naturaleza de "docker rmi".
  • Se mostrarán muchos mensajes de error en la pantalla, y puede decidir si desea 2>/dev/null o no
  • Aprende algo de docker-gc y resuelve su problema (no puede eliminar la imagen que tiene la etiqueta de repo: mutliple)

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


ACTUALIZADO 2017 (NUEVO)

docker container prune

Esta - 2017 (VIEJA) manera

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)


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

docker system prune

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

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

De manera similar, si está limpiando cosas de la ventana acoplable, puede deshacerse de las imágenes sin etiquetar y sin nombre de esta manera:

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


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 apoyado ajustes ambientales

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

FORCE_IMAGE_REMOVAL=1

Forzando la eliminación de contenedores

FORCE_CONTAINER_REMOVAL=1

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

GRACE_PERIOD_SECONDS=86400

Esta configuración también evita la eliminación de imágenes creadas hace menos de GRACE_PERIOD_SECONDS segundos atrás.

Carrera seca

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)

borra todas las imágenes asociadas con los contenedores docker que no se están ejecutando

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

limpie los volúmenes de la ventana acoplable huérfanos para la versión de la ventana acoplable 1.10.x y 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


Respuesta actualizada Use docker system prune docker container prune o docker container prune ahora. Ver la respuesta actualizada de VonC .

Respuesta anterior Al componer varios consejos diferentes arriba, 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 permite filtrar su lista de contenedores impresos (en este caso, estamos filtrando para mostrar solo los contenedores salidos)

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 la ventana acoplable ps -a -q y pasar sus identificadores a la ventana acoplable. 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 las imágenes antiguas para ahorrar algo de espacio.

sudo docker rmi $ (imágenes de sudo docker -q --filter "dangling = true")


#!/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


docker rm --force `docker ps -qa`