..

Docker dangling 이미지 삭제

개요

도커에서 <none> 태그가 붙은 이미지dangling image들이 많이 쌓인 상황일 경우, 명령어를 통해 한 번에 dangling image를 정리하는 방법을 설명합니다.

 

발단

도커를 사용하던 중 <none> 태그가 붙은 쓸모없는 이미지들이 쌓여버렸다.
4개의 도커 이미지 정리가 필요하다.

$ docker image ls
REPOSITORY                             TAG           IMAGE ID       CREATED          SIZE
<none>                                 <none>        a52cae4543de   10 minutes ago   522MB
younsunglee/docker-nodejs-toyproject   746c681       5dee88486167   2 days ago       1GB
younsunglee/docker-nodejs-toyproject   <none>        3a8850aa21bf   3 days ago       1.01GB
younsunglee/docker-nodejs-toyproject   bd2f64b       4ece06c282a8   3 days ago       1GB
younsunglee/docker-nodejs-toyproject   8d27e5f49     7e7bf7400489   3 days ago       1GB
younsunglee/docker-nodejs-toyproject   latest        7e7bf7400489   3 days ago       1GB
younsunglee/docker-nodejs-toyproject   <none>        7e989628d966   3 days ago       1GB
jenkins-docker                         latest        141715b7bf00   3 days ago       522MB
<none>                                 <none>        0bd92a6415d2   3 days ago       522MB
node                                   latest        a283f62cb84b   2 weeks ago      993MB
mysql                                  latest        3218b38490ce   2 weeks ago      516MB
jenkins/jenkins                        lts           2a4bbe50c40b   4 weeks ago      441MB
gradle                                 jdk8-alpine   8017d8c2ba74   2 years ago      204MB
node                                   4.6           e834398209c1   5 years ago      646MB

 

환경

  • Architecture : x86_64
  • OS : Ubuntu 20.04.3 LTS
  • Shell : bash
  • Docker : version 20.10.12, build e91ed57

 

TL;DR

시간이 없는 분들을 위해서 조치방법만 요약한 내용입니다.
자세한 해결방법은 아래 해결방법을 참조하세요.

# 이미지 목록 조회
$ docker images

# dangling 이미지 삭제
$ docker rmi $(docker images -f "dangling=true" -q)

# 위 명령어가 실행 안될 경우는 강제 삭제(-f, --force) 시도
$ docker rmi -f $(docker images -f "dangling=true" -q)

# 삭제 결과 확인
$ docker images

 

해결방법

1. 이미지 확인

<none> 태그가 붙은 쓸모없는 이미지들을 먼저 확인한다.

$ docker images
REPOSITORY                             TAG           IMAGE ID       CREATED          SIZE
<none>                                 <none>        a52cae4543de   16 minutes ago   522MB
younsunglee/docker-nodejs-toyproject   746c681       5dee88486167   2 days ago       1GB
younsunglee/docker-nodejs-toyproject   <none>        3a8850aa21bf   3 days ago       1.01GB
younsunglee/docker-nodejs-toyproject   bd2f64b       4ece06c282a8   3 days ago       1GB
younsunglee/docker-nodejs-toyproject   8d27e5f49     7e7bf7400489   3 days ago       1GB
younsunglee/docker-nodejs-toyproject   latest        7e7bf7400489   3 days ago       1GB
younsunglee/docker-nodejs-toyproject   <none>        7e989628d966   3 days ago       1GB
jenkins-docker                         latest        141715b7bf00   3 days ago       522MB
<none>                                 <none>        0bd92a6415d2   3 days ago       522MB
node                                   latest        a283f62cb84b   2 weeks ago      993MB
mysql                                  latest        3218b38490ce   2 weeks ago      516MB
jenkins/jenkins                        lts           2a4bbe50c40b   4 weeks ago      441MB
gradle                                 jdk8-alpine   8017d8c2ba74   2 years ago      204MB
node                                   4.6           e834398209c1   5 years ago      646MB

나는 심한 편은 아니지만 약 4개정도의 <none> 태그가 붙은 이미지들이 있다.

Docker에서는 이런 이미지를 댕글링 이미지(dangling image)라고 부른다.

 

Dangling Image

댕글링 이미지는 같은 이름과 태그의 새 이미지로 덮어쓸 때 생성된다.
동일한 태그를 가진 Docker 이미지가 빌드될 경우, 기존에 있던 이미지는 삭제되지는 않고 tag가 <none>으로 변경된 상태로 남아 있는다.
댕글링 이미지는 태그가 지정된 이미지와 관련이 없는 불필요한 레이어이기 때문에 정리가 필요하다.

  • 댕글링 이미지는 더 이상 이미지 빌드에 사용하지 못하고 디스크 공간만 차지할 뿐이다.
  • 관리적 측면에서도 docker images 명령어로 도커 이미지를 확인하는 상황에서 헷갈리게 만든다.

이런 여러가지 이유로 주기적으로 댕글링 이미지(dangling image)를 정리할 필요가 있다.

 

2. 삭제 전 IMAGE ID 확인

$ docker images -f "dangling=true" -q
a52cae4543de
3a8850aa21bf
7e989628d966
0bd92a6415d2

<none> 태그가 붙은 도커 이미지의 Image ID만 출력된다.

명령어 옵션
-f <Key=Value> : 이미지를 조회할 때 특정 조건(filter)을 걸어서 조건에 해당되는 이미지만 출력한다.
-q (--quiet) : 이미지 ID만 출력한다.

 

3. 이미지 삭제

<none> 태그가 붙은 dangling된 이미지들만 필터링해서 삭제한다.

$ docker rmi $(docker images -f "dangling=true" -q)
Deleted: sha256:a52cae4543de475309ec97e30d7e1ec26b837bd6b1c34d8964e50f6d32be2742
Deleted: sha256:aad7d00427d8fdddfe06e6163e2a0696954bc9a0561f52e035b200b554f2e910
Deleted: sha256:f28088ff254ca63f5eb796dc7cb6cd34a51b9f6904f5b46ab36b84e817369c95
Deleted: sha256:2683a7c7d842eab9795d164c7a5271753eac60024d8a95bcb74c27a150c9438f
Untagged: younsunglee/docker-nodejs-toyproject@sha256:52baff698058be6b7bd961857038e19ad019a03e95210ca053176bee6eb37f9e
Deleted: sha256:3a8850aa21bfc17d9ddd3bb2a1cbbae7c752b69ed62ef15d9f6d5220f9ae7d02
Deleted: sha256:b69cba1495e82131fc54da34b136fa88f8d4066e8cb18354b25f2b3dd0ecf84d
Deleted: sha256:69e70dbd2172741b5215a4ccc127d14a3c44d17ceba5d4d214f8cbe0b931c64f
Deleted: sha256:1d850ae78effc483872e1f594733ef7858b09c9c98276d30c6350674527d48e9
Deleted: sha256:bad8a7081865b98d6d799161ca21c3e4328b235d30f3510d0ef78e586a63d836
Deleted: sha256:06e0c9e5ff491fd138f7762d1d1a2803e545aff3d22bfdcaace5d9a44d2542ed
Deleted: sha256:0bd92a6415d2e368042811b8a1cb4b2481b5fab4fd5e82bd5e7af83d154e0eff
Deleted: sha256:ac00a7709991e802542a5ef86251f01e1aced9369d6bbcc9dbcae9fa1f8f3a21
Deleted: sha256:254da0fd6eee155fdd01d19c02efde3ed476d495925c02ddd463147978d7df84

 

특정 컨테이너 이미지가 삭제 안될 경우

증상
컨테이너 이미지 삭제 과정에서 image is being used by stopped container ... 에러 메세지와 함께 특정 이미지가 삭제되지 않는다.

$ docker rmi $(docker images -f "dangling=true" -q)
Deleted: sha256:a52cae4543de475309ec97e30d7e1ec26b837bd6b1c34d8964e50f6d32be2742
Deleted: sha256:aad7d00427d8fdddfe06e6163e2a0696954bc9a0561f52e035b200b554f2e910
Deleted: sha256:f28088ff254ca63f5eb796dc7cb6cd34a51b9f6904f5b46ab36b84e817369c95
Deleted: sha256:2683a7c7d842eab9795d164c7a5271753eac60024d8a95bcb74c27a150c9438f
Untagged: younsunglee/docker-nodejs-toyproject@sha256:52baff698058be6b7bd961857038e19ad019a03e95210ca053176bee6eb37f9e
Deleted: sha256:3a8850aa21bfc17d9ddd3bb2a1cbbae7c752b69ed62ef15d9f6d5220f9ae7d02
Deleted: sha256:b69cba1495e82131fc54da34b136fa88f8d4066e8cb18354b25f2b3dd0ecf84d
Deleted: sha256:69e70dbd2172741b5215a4ccc127d14a3c44d17ceba5d4d214f8cbe0b931c64f
Deleted: sha256:1d850ae78effc483872e1f594733ef7858b09c9c98276d30c6350674527d48e9
Deleted: sha256:bad8a7081865b98d6d799161ca21c3e4328b235d30f3510d0ef78e586a63d836
Deleted: sha256:06e0c9e5ff491fd138f7762d1d1a2803e545aff3d22bfdcaace5d9a44d2542ed
Deleted: sha256:0bd92a6415d2e368042811b8a1cb4b2481b5fab4fd5e82bd5e7af83d154e0eff
Deleted: sha256:ac00a7709991e802542a5ef86251f01e1aced9369d6bbcc9dbcae9fa1f8f3a21
Deleted: sha256:254da0fd6eee155fdd01d19c02efde3ed476d495925c02ddd463147978d7df84
Error response from daemon: conflict: unable to delete 7e989628d966 (cannot be forced) - image is being used by stopped container 234d5e511f5f

원인
해당 이미지를 중지된 상태(stopped container)의 컨테이너가 참조하고 있어서 삭제가 불가능하다는 의미이다.

조치방법
도커 이미지를 삭제 명령어인 docker rmi를 실행할 때 강제 삭제-f, --force 옵션을 주면 된다.

$ docker rmi -f $(docker images -f "dangling=true" -q)
Untagged: younsunglee/docker-nodejs-toyproject@sha256:a7098ab967d86ee2b2d7431cc4be1c940b100cb964e86fb29fb6f964ba67d381
Deleted: sha256:7e989628d966c9c6c79477d85551cf72deac685286b3a598369e31465335b50e
Deleted: sha256:172a4bf7f894bd7531cf11c24462aa3445667ec4ad80f5b7dec91b2326f70291
Deleted: sha256:8aaa4b338fc57490904b23497b579b4f760291a565d27f72d951c94b87c344fd
Deleted: sha256:e00dfa43e425da0e1a3d3493b40cb6a298cf3ab82621531f4a87edb0542d4ece

아까 삭제 실패했던 이미지가 -f 옵션을 주니까 삭제 처리된다.

 

4. 이미지 삭제결과 확인

$ docker images
REPOSITORY                             TAG           IMAGE ID       CREATED       SIZE
younsunglee/docker-nodejs-toyproject   746c681       5dee88486167   2 days ago    1GB
younsunglee/docker-nodejs-toyproject   bd2f64b       4ece06c282a8   3 days ago    1GB
younsunglee/docker-nodejs-toyproject   8d27e5f49     7e7bf7400489   3 days ago    1GB
younsunglee/docker-nodejs-toyproject   latest        7e7bf7400489   3 days ago    1GB
jenkins-docker                         latest        141715b7bf00   3 days ago    522MB
node                                   latest        a283f62cb84b   2 weeks ago   993MB
mysql                                  latest        3218b38490ce   2 weeks ago   516MB
jenkins/jenkins                        lts           2a4bbe50c40b   4 weeks ago   441MB
gradle                                 jdk8-alpine   8017d8c2ba74   2 years ago   204MB
node                                   4.6           e834398209c1   5 years ago   646MB

이것으로 <none> 태그가 붙은 dangling 이미지들이 모두 삭제되었다.

조치 완료.