at 24.11-pre 173 lines 4.2 kB view raw
1#! /usr/bin/env bash 2 3set -e -o pipefail 4 5os= 6arch= 7imageName= 8imageTag= 9imageDigest= 10finalImageName= 11finalImageTag= 12hashType=$NIX_HASH_ALGO 13hashFormat=$hashFormat 14format=nix 15 16usage(){ 17 echo >&2 "syntax: nix-prefetch-docker [options] [IMAGE_NAME [IMAGE_TAG|IMAGE_DIGEST]] 18 19Options: 20 --os os OS to fetch image for 21 --arch linux Arch to fetch image for 22 --image-name name Name of the image to fetch 23 --image-tag tag Image tag 24 --image-digest digest Image digest 25 --final-image-name name Desired name of the image 26 --final-image-tag tag Desired image tag 27 --json Output result in json format instead of nix 28 --quiet Only print the final result 29" 30 exit 1 31} 32 33get_image_digest(){ 34 local imageName=$1 35 local imageTag=$2 36 37 if test -z "$imageTag"; then 38 imageTag="latest" 39 fi 40 41 skopeo --override-os "${os}" --override-arch "${arch}" --insecure-policy --tmpdir=$TMPDIR inspect "docker://$imageName:$imageTag" | jq '.Digest' -r 42} 43 44get_name() { 45 local imageName=$1 46 local imageTag=$2 47 48 echo "docker-image-$(echo "$imageName:$imageTag" | tr '/:' '-').tar" 49} 50 51argi=0 52argfun="" 53for arg; do 54 if test -z "$argfun"; then 55 case $arg in 56 --os) argfun=set_os;; 57 --arch) argfun=set_arch;; 58 --image-name) argfun=set_imageName;; 59 --image-tag) argfun=set_imageTag;; 60 --image-digest) argfun=set_imageDigest;; 61 --final-image-name) argfun=set_finalImageName;; 62 --final-image-tag) argfun=set_finalImageTag;; 63 --quiet) QUIET=true;; 64 --json) format=json;; 65 --help) usage; exit;; 66 *) 67 : $((++argi)) 68 case $argi in 69 1) imageName=$arg;; 70 2) [[ $arg == *"sha256"* ]] && imageDigest=$arg || imageTag=$arg;; 71 *) exit 1;; 72 esac 73 ;; 74 esac 75 else 76 case $argfun in 77 set_*) 78 var=${argfun#set_} 79 eval $var=$arg 80 ;; 81 esac 82 argfun="" 83 fi 84done 85 86if test -z "$imageName"; then 87 usage 88fi 89 90if test -z "$os"; then 91 os=linux 92fi 93 94if test -z "$arch"; then 95 arch=amd64 96fi 97 98if test -z "$hashType"; then 99 hashType=sha256 100fi 101 102if test -z "$hashFormat"; then 103 hashFormat=base32 104fi 105 106if test -z "$finalImageName"; then 107 finalImageName="$imageName" 108fi 109 110if test -z "$finalImageTag"; then 111 if test -z "$imageTag"; then 112 finalImageTag="latest" 113 else 114 finalImageTag="$imageTag" 115 fi 116fi 117 118if test -z "$imageDigest"; then 119 imageDigest=$(get_image_digest $imageName $imageTag) 120fi 121 122sourceUrl="docker://$imageName@$imageDigest" 123 124tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/skopeo-copy-tmp-XXXXXXXX")" 125trap "rm -rf \"$tmpPath\"" EXIT 126 127tmpFile="$tmpPath/$(get_name $finalImageName $finalImageTag)" 128 129if test -z "$QUIET"; then 130 skopeo --insecure-policy --tmpdir=$TMPDIR --override-os ${os} --override-arch ${arch} copy "$sourceUrl" "docker-archive://$tmpFile:$finalImageName:$finalImageTag" >&2 131else 132 skopeo --insecure-policy --tmpdir=$TMPDIR --override-os ${os} --override-arch ${arch} copy "$sourceUrl" "docker-archive://$tmpFile:$finalImageName:$finalImageTag" > /dev/null 133fi 134 135# Compute the hash. 136imageHash=$(nix-hash --flat --type $hashType --base32 "$tmpFile") 137 138# Add the downloaded file to Nix store. 139finalPath=$(nix-store --add-fixed "$hashType" "$tmpFile") 140 141if test -z "$QUIET"; then 142 echo "-> ImageName: $imageName" >&2 143 echo "-> ImageDigest: $imageDigest" >&2 144 echo "-> FinalImageName: $finalImageName" >&2 145 echo "-> FinalImageTag: $finalImageTag" >&2 146 echo "-> ImagePath: $finalPath" >&2 147 echo "-> ImageHash: $imageHash" >&2 148fi 149 150if [ "$format" == "nix" ]; then 151cat <<EOF 152{ 153 imageName = "$imageName"; 154 imageDigest = "$imageDigest"; 155 sha256 = "$imageHash"; 156 finalImageName = "$finalImageName"; 157 finalImageTag = "$finalImageTag"; 158} 159EOF 160 161else 162 163cat <<EOF 164{ 165 "imageName": "$imageName", 166 "imageDigest": "$imageDigest", 167 "sha256": "$imageHash", 168 "finalImageName": "$finalImageName", 169 "finalImageTag": "$finalImageTag" 170} 171EOF 172 173fi