[Docker] 도커 <none>/dangling image 삭제
항상 도커 컨테이너를 생성하고 삭제만 했지, 도커 이미지를 확인할 생각을 하지 않았다.
아래 명령어로 이미지 목록을 조회해 보니 엄청난 수의 `<none>:<none>` 이미지들이 있었다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none>
<none> <none>
<none> <none>
.
.
.
해당 이미지들은 많은 용량을 차지하고 있었기 때문에 지워줄 필요가 있었다. 하지만 `none`으로 태그 된 이미지들을 하나하나 지우기에는 좀... 그랬다...
그래서 바로 해당 태그들을 한 번에 지울 수 있는 방법을 검색해 봤는데, 역시나 다들 똑같은 생각을 하는 것 같다.
도커 이미지 삭제
도커 특정 이미지를 삭제할 때는 아래 명령어를 사용하면 된다. 이때 해당 이미지를 사용 중인 컨테이너가 있다면 삭제할 수 없다.
$ docker rmi image_id
`rm`은 remove, `i`는 image의 줄임말이다.
<none> image
`<none>` 이미지는 `dangling image` 라고 부르는데, 더 이상 사용되지 않는 이미지를 뜻한다. 생성 원인은 빌드 실패나 이미지 빌드 시 태그명이 중복되거나 등이 있다.
`<none>` 태그를 가진 이미지를 모두 지울 때는 아래 명령어를 사용하면 된다.
$ docker rmi $(docker images -f "dangling=true" -q)
- `-f` 옵션: `filter`를 뜻하며 `dangling=true` 필터를 지정하여, dangling 이미지 목록만 보여준다.
- `-q` 옵션: `IMAGE ID` 목록만 조회
위 명령어를 사용했을 때 아래 같은 에러가 발생할 수도 있다.
Error response from daemon: conflict: unable to remove repository reference "..." (must force) - container container_id is using its referenced image image_id
에러의 의미는 `image_id` 이미지를 사용중인 컨테이너가 실행 중이므로 삭제할 수 없다는 뜻으로, 해당 컨테이너를 중지시킨 후 다시 이미지를 삭제하면 된다.
또는 `-f/--force` 옵션을 사용하여 강제로 삭제시킬 수 있다.
$ docker rmi -f $(docker images -f "dangling=true" -q)
`-f` 옵션은 강제로 삭제하기 때문에 항상 어떤 이미지인지 확인해 보고 사용해야 한다.
prune
`prune` 명령어도 dangling 이미지를 삭제해준다. `prune` 명령어는 Docker API 1.25 이상부터 지원된다.
$ docker image prune
참고