도커 이미지를 실행하면 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