From dde58651401cf6ab4d63cdec043d677607af0924 Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Sat, 1 Jul 2017 13:23:12 +0200 Subject: [PATCH 1/2] docker-tools: set group/owner when creating a pure layer --- pkgs/build-support/docker/default.nix | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix index 4ebe3c0615d3..004816a0b392 100644 --- a/pkgs/build-support/docker/default.nix +++ b/pkgs/build-support/docker/default.nix @@ -234,11 +234,10 @@ rec { # Files to add to the layer. contents ? null, # Additional commands to run on the layer before it is tar'd up. - extraCommands ? "" + extraCommands ? "", uid ? 0, gid ? 0 }: runCommand "docker-layer-${name}" { inherit baseJson contents extraCommands; - buildInputs = [ jshon rsync ]; } '' @@ -260,7 +259,7 @@ rec { # Tar up the layer and throw it into 'layer.tar'. echo "Packing layer..." mkdir $out - tar -C layer --mtime="@$SOURCE_DATE_EPOCH" -cf $out/layer.tar . + tar -C layer --mtime="@$SOURCE_DATE_EPOCH" --owner=${toString uid} --group=${toString gid} -cf $out/layer.tar . # Compute a checksum of the tarball. echo "Computing layer checksum..." @@ -297,7 +296,7 @@ rec { # How much disk to allocate for the temporary virtual machine. diskSize ? 1024, # Commands (bash) to run on the layer; these do not require sudo. - extraCommands ? "" + extraCommands ? "", uid ? 0, gid ? 0 }: # Generate an executable script from the `runAsRoot` text. let runAsRootScript = shellScript "run-as-root.sh" runAsRoot; @@ -375,7 +374,7 @@ rec { # Docker config; e.g. what command to run on the container. config ? null, # Optional bash script to run on the files prior to fixturizing the layer. - extraCommands ? "", + extraCommands ? "", uid ? 0, gid ? 0, # Optional bash script to run as root on the image when provisioning. runAsRoot ? null, # Size of the virtual machine disk to provision when building the image. @@ -398,7 +397,7 @@ rec { if runAsRoot == null then mkPureLayer { name = baseName; - inherit baseJson contents extraCommands; + inherit baseJson contents extraCommands uid gid; } else mkRootLayer { name = baseName; inherit baseJson fromImage fromImageName fromImageTag @@ -498,7 +497,7 @@ rec { chmod -R a-w image echo "Cooking the image..." - tar -C image --mtime="@$SOURCE_DATE_EPOCH" -c . | pigz -nT > $out + tar -C image --mtime="@$SOURCE_DATE_EPOCH" --owner=0 --group=0 -c . | pigz -nT > $out echo "Finished." ''; From 83fbc0f0359f6885d5c3b22fb5331f459ade7329 Mon Sep 17 00:00:00 2001 From: Daiderd Jordan Date: Sat, 1 Jul 2017 16:59:15 +0200 Subject: [PATCH 2/2] docker-tools: fixup permssions for extraCommands --- pkgs/build-support/docker/default.nix | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkgs/build-support/docker/default.nix b/pkgs/build-support/docker/default.nix index 004816a0b392..592dcd3cae7b 100644 --- a/pkgs/build-support/docker/default.nix +++ b/pkgs/build-support/docker/default.nix @@ -252,6 +252,8 @@ rec { echo "No contents to add to layer." fi + chmod ug+w layer + if [[ -n $extraCommands ]]; then (cd layer; eval "$extraCommands") fi @@ -296,7 +298,7 @@ rec { # How much disk to allocate for the temporary virtual machine. diskSize ? 1024, # Commands (bash) to run on the layer; these do not require sudo. - extraCommands ? "", uid ? 0, gid ? 0 + extraCommands ? "" }: # Generate an executable script from the `runAsRoot` text. let runAsRootScript = shellScript "run-as-root.sh" runAsRoot; @@ -311,6 +313,8 @@ rec { echo "Adding $item..." rsync -ak --chown=0:0 $item/ layer/ done + + chmod ug+w layer ''; postMount = ''