Skip to content

Commit

Permalink
Merge pull request #94243 from johanot/dockertools-fix-nixstore-perms
Browse files Browse the repository at this point in the history
dockertools: fix buildLayeredImage nix-store permissions
  • Loading branch information
srhb authored Jul 31, 2020
2 parents 471f367 + f5db415 commit c5a1eaf
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
10 changes: 10 additions & 0 deletions nixos/tests/docker-tools.nix
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,16 @@ import ./make-test-python.nix ({ pkgs, ... }: {
"docker rmi ${examples.nix.imageName}",
)
with subtest(
"Ensure (layered) nix store has correct permissions "
"and that the container starts when its process does not have uid 0"
):
docker.succeed(
"docker load --input='${examples.bashLayeredWithUser}'",
"docker run -u somebody --rm ${examples.bashLayeredWithUser.imageName} ${pkgs.bash}/bin/bash -c 'test 555 == $(stat --format=%a /nix) && test 555 == $(stat --format=%a /nix/store)'",
"docker rmi ${examples.bashLayeredWithUser.imageName}",
)
with subtest("The nix binary symlinks are intact"):
docker.succeed(
"docker load --input='${examples.nix}'",
Expand Down
36 changes: 36 additions & 0 deletions pkgs/build-support/docker/examples.nix
Original file line number Diff line number Diff line change
Expand Up @@ -382,4 +382,40 @@ rec {
contents = pkgs.bashInteractive;
};

# buildLayeredImage with non-root user
bashLayeredWithUser =
let
nonRootShadowSetup = { user, uid, gid ? uid }: with pkgs; [
(
writeTextDir "etc/shadow" ''
root:!x:::::::
${user}:!:::::::
''
)
(
writeTextDir "etc/passwd" ''
root:x:0:0::/root:${runtimeShell}
${user}:x:${toString uid}:${toString gid}::/home/${user}:
''
)
(
writeTextDir "etc/group" ''
root:x:0:
${user}:x:${toString gid}:
''
)
(
writeTextDir "etc/gshadow" ''
root:x::
${user}:x::
''
)
];
in
pkgs.dockerTools.buildLayeredImage {
name = "bash-layered-with-user";
tag = "latest";
contents = [ pkgs.bash pkgs.coreutils (nonRootShadowSetup { uid = 999; user = "somebody"; }) ];
};

}
8 changes: 6 additions & 2 deletions pkgs/build-support/docker/stream_layered_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ def apply_filters(ti):
ti.gname = "root"
return filter(ti)

def nix_root(ti):
ti.mode = 0o0555 # r-xr-xr-x
return ti

def dir(path):
ti = tarfile.TarInfo(path)
ti.type = tarfile.DIRTYPE
Expand All @@ -84,8 +88,8 @@ def dir(path):
# these directories first when building layer tarballs. But
# we don't need them on the customisation layer.
if add_nix:
tar.addfile(apply_filters(dir("/nix")))
tar.addfile(apply_filters(dir("/nix/store")))
tar.addfile(apply_filters(nix_root(dir("/nix"))))
tar.addfile(apply_filters(nix_root(dir("/nix/store"))))

for path in paths:
path = pathlib.Path(path)
Expand Down

0 comments on commit c5a1eaf

Please sign in to comment.