레이블과 이름이 포함된 도커 이미지 찾기

레이블과 이름이 포함된 도커 이미지 찾기

도커 이미지를 실행하면 docker images여러 태그가 있는 이미지와 최신 태그 값이 있는 이미지가 포함된 다음 목록이 표시됩니다.

REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
m1                                  latest              40febdb010b1        15 minutes ago      479MB
m2                                    130                 fab5a122127a        4 weeks ago         2.74GB
m2                                    115                 5a2ee5c5f5e5        4 weeks ago         818MB
m3                                    111                 dd91a7f68e3d        5 weeks ago         818MB
m3                                     23                  0657662756f6        5 weeks ago         2.22GB
m4                                     23                  0657662756f6        5 weeks ago         2.22GB

이 작업을 수행하는 동안 하나의 라이너 명령으로 이를 달성하는 방법에 표시된 대로 태그와 도커 이미지 이름이 있는 도커 이미지를 제외하고 for i in {docker image save -o <imagename>.tar}이미지를 더 많은 수의 태그가 있는 tar로만 저장하고 싶습니다 .latestm4

답변1

Bash를 사용한다고 가정하면 다음과 같은 작업을 수행하는 "단일 라이너"가 있습니다.

unset saved; declare -A saved; docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi; if [[ "${saved[$repo]}" != true ]]; then docker image save -o "$repo-$tag".tar "$repo:$tag"; saved["$repo"]=true; fi; done

분리해 보면 이해할 수 있습니다.

unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
  if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]]; then continue; fi
  if [[ "${saved[$repo]}" != true ]]; then
    docker image save -o "$repo-$tag".tar "$repo:$tag"
    saved["$repo"]=true
  fi
done

이는 연관 배열을 선언하고 saved, 저장소와 태그만 포함하는 이미지를 나열하고, latest이미지를 건너뛰고, 저장소가 아직 저장되지 않은 경우 이미지를 저장합니다. 후자를 결정하기 위해 이미지가 저장될 때 이 사실이 배열에 기록됩니다. saved이미지를 저장하기 전에 동일한 저장소의 이미지가 이미 저장되었는지 확인하기 위해 배열을 검사합니다.

docker images최신 이미지부터 시작하여 이미지를 나열하므로 동일한 저장소(또는 이름)를 공유하는 이미지가 여러 개 있을 때마다 최신 이미지가 저장됩니다.

tarball 이름에는 특별한 처리가 없으므로 슬래시가 포함된 저장소에서는 작업이 완료되지 않을 수 있습니다. 또한 저장소나 태그가 없는 이미지도 처리할 수 없습니다. 아래의 더 긴 버전은 필요에 따라 하위 디렉터리를 만들고 태그가 지정되지 않은 이미지를 건너뜁니다.

unset saved
declare -A saved
docker images --format '{{.Repository}} {{.Tag}}' | while read repo tag; do
  if [[ "$repo" == "m4" ]] || [[ "$tag" == latest ]] || [[ "$repo" == "<none>" ]] || [[ "$tag" == "<none>" ]]; then continue; fi
  if [[ "${saved[$repo]}" != true ]]; then
    if [[ "${repo}" =~ "/" ]]; then mkdir -p "${repo%/*}"; fi
    docker image save -o "$repo-$tag".tar "$repo:$tag"
    saved["$repo"]=true
  fi
done

관련 정보