이름을 기반으로 Docker 이미지를 제거하는 방법은 무엇입니까?


92

주어진 문자열 ( imagename) 이 포함 된 이름을 가진 모든 버전의 도커 이미지를 삭제하고 싶습니다 .
아래를 시도했지만 작동하지 않는 것 같습니다.

docker images | grep 'imagename' | xargs -I {} docker rmi

답변:


134

다음을 시도하십시오.

docker rmi $(docker images |grep 'imagename')

Windows Powershell :

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}"|findstr "imagename")

16
Docker의 현재 버전은 이것을 지원합니다 (grep 없음) : docker rmi $ (docker images 'imagename')
Charlie

현재 버전의 Docker가이를 지원하는 것 같습니다. 뭔가 빠진 것이 있습니까? - 고정 표시기 RMI '참고 ImageName'
찰리

8
나는 대부분의 사람들이 모든 이미지를 일치시킬 방법을 찾고 있다고 생각 @Charlie 일치하는 ' 참고 ImageName 정확히 'imagename'이라는 단일 이미지가 아닌 ' 합니다.
RJFalconer

다음과 같은 오류가 발생합니다. "docker rmi에는 최소한 하나의 인수가 필요합니다."
미 칼리

@michali 그것은 당신이 바로 실행하여 일치하는 항목의 존재가 확인 returned.Can 일치하는 이미지가 없다는 것을 의미 :docker images |grep 'imagename'
연락처 Rambler

71

약간 더 정확한 버전-저장소 이름에만 grepping :

docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

25
이 이미지 만 같은 최신 태그 제거docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')
드류를

감사합니다! 이것이 내가 찾던 것이었다.
Hardhik

26
docker rmi $(docker images --format '{{.Repository}}:{{.Tag}}' | grep 'imagename')

1
이것이 무엇을하는지 설명해 주시겠습니까? 임의의 코드는 위험 할 수 있습니다.
kilojoules

6
docker images --format '{{.Repository}}:{{.Tag}}출력을 필터링하므로 repo 및 태그 만 표시됩니다 (예 :) foo:latest. grep 'imagename해당 행을 포함하는 이미지로만 필터링합니다 imagename. 그것을 넣는 것은 $()& docker rmi일치 된 이미지를 제거하는 외부로 전달되는 것을 평가합니다 .
Adam Parkin

위를 확장하면 다음과 같이 정확한 이미지 이름에 해당하는 태그가 지정된 모든 이미지를 삭제할 수 있습니다.docker rmi -f $(docker images --format '{{.Repository}}:{{.Tag}}' --filter=reference='imagename:*')'
timmins

1
창에 "GREP은"(cmd를 또는 PowerShell을) 다음은 과부에 사용할 수있는 존재하지 않는docker rmi $( docker images --format '{{.Repository}}:{{.Tag}}' | Select-String -Pattern 'imagename')
Zameer Fouzan

20

docker images실제로 필터링 할 이미지 이름으로 첫 번째 위치 인수를 사용합니다. grep 및 awk가 필요하지 않습니다. 그만큼-q 옵션은에 공급할 수있는 일치하는 이미지 ID 만 반환합니다 docker rmi.

docker rmi --force $(docker images -q 'imagename' | uniq)

uniq같은 이미지가 다르게 태그가있는 경우, 중복을 제거하기 위해 필요합니다.


이것은 확실히 오늘날 최고의 선택입니다. 이미지 이름은 따옴표로 묶어야하지만 질문의 일관성을 유지하기 위해.
Colm Bhandal

8

간단히 --force명령 끝에 추가 할 수 있습니다 . 처럼:

sudo docker rmi <docker_image_id> --force

보다 지능적으로 만들기 위해 이미지를 제거하기 전에 실행중인 컨테이너를 중지 할 수 있습니다.

sudo docker stop $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rm $(docker ps | grep <your_container_name> | awk '{print $1}')

sudo docker rmi $(docker images | grep <your_image_name> | awk '{print $3}') --force

에서 docker ps, $ 1 1 열, 즉 고정 표시기 컨테이너 ID이며, $ 3은 3 열, 즉 고정 표시기 이미지 ID입니다


5

내 대답이 더 간단하다고 생각합니다.

예를 들어, 이미지 이름은 python_image 입니다.

그러면 코드는 다음과 같아야합니다 .

docker rmi $(docker images --filter=reference='python_image' --format "{{.ID}}")

이게 도움이 되길 바란다.


와일드 카드 이름을 기반으로 여러 이미지에 대해이 작업을 수행 할 수 있습니까?
변수

3

또 다른 간결한 대답을 얻었습니다. 유일한 변경은 불필요한 -I {}플래그 를 제거하는 것 입니다.

docker images | grep 'imagename' | xargs docker rmi


3
docker rmi `docker images | awk '$1 ~ /imageName/ {print $3}'`

이렇게하면 "imageName"이라는 이름으로 모든 이미지가 제거됩니다. 경우에 따라 "이미지가 하나 이상의 저장소에서 참조 됨"과 같은 오류가 발생할 수 있습니다. 이 경우 강제 삭제를 사용하십시오.

docker rmi -f `docker images | awk '$1 ~ /imageName/ {print $3}'`

다른 방법은 다음과 같습니다.

docker images | awk '{ OFS = ":" }$1 ~ /imageName/ {print $1,$2}'

3

어떤 이유로 여기에 주어진 답변을 사용할 수 없었습니다. 여기에 저에게 효과적이었습니다.

docker images | grep \"gcr.io/kubernetes-learn-197422/last-week-weather-service\" | awk '{print $3}' | xargs docker rmi

awk '{print $3}'중요한 부분입니다. 세 번째 열에서 ID를 추출합니다.


3

나를 위해 일했습니다 ( Docker 버전 19.03.5 ) :

docker rmi $(docker images 'imagename' -q)

" docker images 'imagename'-q " 명령 은 작은 따옴표로 묶인 인수의 모든 이미지 ID를 나열하므로이를 docker rmi (또는 강제를 위해 docker rmi -f) 와 연결하면 선택한 이름의 모든 이미지가 제거됩니다.



0

사소한 말 : 우리가 경험 한 바에 따르면 docker 18.03 이후로 더 이상 이름만으로 태그가 지정되지 않은 이미지를 제거 할 수없는 것 같습니다. 위에 명시된 이름 + 태그를 사용하거나 ID를 사용해야합니다.

docker images --format={{.ID}} | xargs -I % sh -c 'docker rmi --force % 2>&1'

0

docker rmi $(docker images --filter=reference="IMAGENAME:TAG")

예를 들어 다음 이미지가있는 경우

REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
abcdefg/hij                   7.0.0-beta-4.0      3128835950cd        7 days ago          51.4MB
abcdefg/hij-action            7.0.0-beta-4.0      42a7255beb74        7 days ago          97.4MB
abcdefg/hij-test              7.0.0-beta-4.0      17246aed35d0        7 days ago          97.4MB
abcdefg/hij-server            7.0.0-beta-4.0      42c45e561f2c        7 days ago          335MB
abcdefg/hij-init              7.0.0-beta-3.0      f648bb622933        7 days ago          55.2MB
abcdefg/hij-dir               7.0.0-beta-3.0      0db07d3aaccf        7 days ago          97.4MB
abcdefg/hij-mount             7.0.0-beta-3.0      18d1c0e1502c        4 weeks ago         33.7MB

그때 docker rmi $(docker images --filter=reference="abcd*:*4.0") 처음 4 개의 이미지를 제거합니다.

자세한 내용은 https://docs.docker.com/engine/reference/commandline/images/ 를 참조 하십시오.


작동하지만 docker images 명령에 '-q'를 추가하는 것이 더 좋습니다. docker rmi $(docker images -q --filter=reference="IMAGENAME:TAG")
troyfolger

0

이전에 게시되지 않은 내 요구 사항을 충족하기 위해이 질문에 대한 해결책을 모으십시오.

로컬에서 빌드 한 이미지를 일치시키고 싶었 library/myapp습니다. 이름을 바꾸고 태그를 지정하고 개인 저장소로 푸시했습니다 myrepo.org/library/myapp. 푸시되면 로컬 도커 레지스트리를 정리하고 싶습니다.

그리고 아무것도 발견되지 않거나 명령이 오류를 던지는 지 상관하지 않습니다. 따라서 || true스크립트에 포함하기 위해 끝에 추가 됩니다.

docker rmi $(docker image ls */library/myApp --format '{{.Repository}}:{{.Tag}}') || true

0

@Aditya의 답변에 따라 이미지를 쉽게 제거하는 bash 함수를 만들 수도 있습니다. 이 함수를 ~/.profile. 새 셸 세션을 생성하거나 source ~/.profile.

function drmi() {
    docker images | grep $1 |  xargs docker rmi
}

용법:

drmi golang

0

정보 :

docker rmi $(docker images --format "{{.Repository}}:{{.Tag}}" |grep imagename |grep none)

이 오류를 제공하십시오.

데몬의 오류 응답 : 잘못된 참조 형식

아마도 내 이미지가 다음과 같기 때문일 것입니다.

hostname:5000/imagename:<none>

이미지 ID를 사용하고 다음 명령을 수행해야했습니다.

docker rmi `docker images --format "{{.Repository}}:{{.Tag}} {{.ID}}" |grep imagename |grep none |cut -d ' ' -f2`

종료 된 컨테이너를 제거하려면 :

docker container rm `docker container ls -a --format "{{.ID}} {{.Image}} {{.Status}}" |grep Exited |grep imagename|cut -d ' ' -f1`
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.