도커 이미지를 실행할 때 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로 저장하고 싶지만 latest
태그 및 도커 이미지 이름이 있는 도커 이미지는 제외하고 m4
하나의 라이너 명령으로 이를 달성하는 방법을 설명합니다.
답변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