aboutsummaryrefslogtreecommitdiff
path: root/pkgs/build-support/docker
diff options
context:
space:
mode:
authorJaka Hudoklin <offlinehacker@users.noreply.github.com>2019-04-06 14:44:19 +0200
committerGitHub <noreply@github.com>2019-04-06 14:44:19 +0200
commitc087b608e8b5abc9c142b7ed7666b1c9dc047820 (patch)
treec3a95a41a1ffff779d24eb954100f2f0d3ec023a /pkgs/build-support/docker
parentcfb6ade58c4731f36ade3baca5d6ddd6afd0095c (diff)
parentc1f0d1978567ff02a07ad6c91647517024af1f09 (diff)
Merge pull request #58360 from xtruder/pkgs/dockerTools/nix-prefetch-docker
dockerTools: add nix-prefetch-docker script
Diffstat (limited to 'pkgs/build-support/docker')
-rwxr-xr-xpkgs/build-support/docker/nix-prefetch-docker173
-rw-r--r--pkgs/build-support/docker/nix-prefetch-docker.nix26
2 files changed, 199 insertions, 0 deletions
diff --git a/pkgs/build-support/docker/nix-prefetch-docker b/pkgs/build-support/docker/nix-prefetch-docker
new file mode 100755
index 00000000000..839dc87487a
--- /dev/null
+++ b/pkgs/build-support/docker/nix-prefetch-docker
@@ -0,0 +1,173 @@
+#! /usr/bin/env bash
+
+set -e -o pipefail
+
+os=
+arch=
+imageName=
+imageTag=
+imageDigest=
+finalImageName=
+finalImageTag=
+hashType=$NIX_HASH_ALGO
+hashFormat=$hashFormat
+format=nix
+
+usage(){
+ echo >&2 "syntax: nix-prefetch-docker [options] [IMAGE_NAME [IMAGE_TAG|IMAGE_DIGEST]]
+
+Options:
+ --os os OS to fetch image for
+ --arch linux Arch to fetch image for
+ --image-name name Name of the image to fetch
+ --image-tag tag Image tag
+ --image-digest digest Image digest
+ --final-image-name name Desired name of the image
+ --final-image-tag tag Desired image tag
+ --json Output result in json format instead of nix
+ --quiet Only print the final result
+"
+ exit 1
+}
+
+get_image_digest(){
+ local imageName=$1
+ local imageTag=$2
+
+ if test -z "$imageTag"; then
+ imageTag="latest"
+ fi
+
+ skopeo inspect "docker://$imageName:$imageTag" | jq '.Digest' -r
+}
+
+get_name() {
+ local imageName=$1
+ local imageTag=$2
+
+ echo "docker-image-$(echo "$imageName:$imageTag" | tr '/:' '-').tar"
+}
+
+argi=0
+argfun=""
+for arg; do
+ if test -z "$argfun"; then
+ case $arg in
+ --os) argfun=set_os;;
+ --arch) argfun=set_arch;;
+ --image-name) argfun=set_imageName;;
+ --image-tag) argfun=set_imageTag;;
+ --image-digest) argfun=set_imageDigest;;
+ --final-image-name) argfun=set_finalImageName;;
+ --final-image-tag) argfun=set_finalImageTag;;
+ --quiet) QUIET=true;;
+ --json) format=json;;
+ --help) usage; exit;;
+ *)
+ : $((++argi))
+ case $argi in
+ 1) imageName=$arg;;
+ 2) [[ $arg == *"sha256"* ]] && imageDigest=$arg || imageTag=$arg;;
+ *) exit 1;;
+ esac
+ ;;
+ esac
+ else
+ case $argfun in
+ set_*)
+ var=${argfun#set_}
+ eval $var=$arg
+ ;;
+ esac
+ argfun=""
+ fi
+done
+
+if test -z "$imageName"; then
+ usage
+fi
+
+if test -z "$os"; then
+ os=linux
+fi
+
+if test -z "$arch"; then
+ arch=amd64
+fi
+
+if test -z "$hashType"; then
+ hashType=sha256
+fi
+
+if test -z "$hashFormat"; then
+ hashFormat=base32
+fi
+
+if test -z "$finalImageName"; then
+ finalImageName="$imageName"
+fi
+
+if test -z "$finalImageTag"; then
+ if test -z "$imageTag"; then
+ finalImageTag="latest"
+ else
+ finalImageTag="$imageTag"
+ fi
+fi
+
+if test -z "$imageDigest"; then
+ imageDigest=$(get_image_digest $imageName $imageTag)
+fi
+
+sourceUrl="docker://$imageName@$imageDigest"
+
+tmpPath="$(mktemp -d "${TMPDIR:-/tmp}/skopeo-copy-tmp-XXXXXXXX")"
+trap "rm -rf \"$tmpPath\"" EXIT
+
+tmpFile="$tmpPath/$(get_name $finalImageName $finalImageTag)"
+
+if test -z "$QUIET"; then
+ skopeo --override-os ${os} --override-arch ${arch} copy "$sourceUrl" "docker-archive://$tmpFile:$finalImageName:$finalImageTag"
+else
+ skopeo --override-os ${os} --override-arch ${arch} copy "$sourceUrl" "docker-archive://$tmpFile:$finalImageName:$finalImageTag" > /dev/null
+fi
+
+# Compute the hash.
+imageHash=$(nix-hash --flat --type $hashType --base32 "$tmpFile")
+
+# Add the downloaded file to Nix store.
+finalPath=$(nix-store --add-fixed "$hashType" "$tmpFile")
+
+if test -z "$QUIET"; then
+ echo "-> ImageName: $imageName"
+ echo "-> ImageDigest: $imageDigest"
+ echo "-> FinalImageName: $finalImageName"
+ echo "-> FinalImageTag: $finalImageTag"
+ echo "-> ImagePath: $finalPath"
+ echo "-> ImageHash: $imageHash"
+fi
+
+if [ "$format" == "nix" ]; then
+cat <<EOF
+{
+ imageName = "$imageName";
+ imageDigest = "$imageDigest";
+ sha256 = "$imageHash";
+ finalImageName = "$finalImageName";
+ finalImageTag = "$finalImageTag";
+}
+EOF
+
+else
+
+cat <<EOF
+{
+ "imageName": "$imageName",
+ "imageDigest": "$imageDigest",
+ "sha256": "$imageHash",
+ "finalImageName": "$finalImageName",
+ "finalImageTag": "$finalImageTag"
+}
+EOF
+
+fi
diff --git a/pkgs/build-support/docker/nix-prefetch-docker.nix b/pkgs/build-support/docker/nix-prefetch-docker.nix
new file mode 100644
index 00000000000..03a936e08e0
--- /dev/null
+++ b/pkgs/build-support/docker/nix-prefetch-docker.nix
@@ -0,0 +1,26 @@
+{ stdenv, makeWrapper, nix, skopeo }:
+
+with stdenv.lib;
+
+stdenv.mkDerivation {
+ name = "nix-prefetch-docker";
+
+ nativeBuildInputs = [ makeWrapper ];
+
+ unpackPhase = ":";
+
+ installPhase = ''
+ install -vD ${./nix-prefetch-docker} $out/bin/$name;
+ wrapProgram $out/bin/$name \
+ --prefix PATH : ${makeBinPath [ nix skopeo ]} \
+ --set HOME /homeless-shelter
+ '';
+
+ preferLocalBuild = true;
+
+ meta = {
+ description = "Script used to obtain source hashes for dockerTools.pullImage";
+ maintainers = with maintainers; [ offline ];
+ platforms = platforms.unix;
+ };
+}