Nix를 사용하여 Docker 이미지를 빌드할 때 루트가 아닌 사용자를 추가하는 방법

Nix를 사용하여 Docker 이미지를 빌드할 때 루트가 아닌 사용자를 추가하는 방법

Nix를 사용하여 Docker 이미지를 지정할 수 있습니다.

{ pkgs ? import <nixpkgs> { }
, pkgsLinux ? import <nixpkgs> { system = "x86_64-linux"; }
}:
pkgs.dockerTools.buildImage {
  name = "delme";
  tag = "latest";
  contents = pkgs.buildEnv {
    name = "image-root";
    paths = with pkgsLinux; [
      bashInteractive
      coreutils
      curl
    ];
    pathsToLink = [ "/bin" ];
  };
  config = {
    Cmd = [ "${pkgsLinux.bashInteractive}/bin/bash" ];
  };
}

이는 작동하지만 결과 이미지는 루트로 실행됩니다. 이 예제를 확장하여 루트가 아닌 사용자(특정 UID/GID 사용 권장)를 추가하고 해당 사용자로 컨테이너가 실행되도록 지정하려면 어떻게 해야 합니까?

답변1

이는 일반 Docker 설치에서 수행하는 작업과 매우 유사하므로 파일 shadowSetup생성 등을 위해 로드되었는지 확인하기만 하면 됩니다 ./etc/passwd설명서에 적힌대로:

{ pkgs ? import <nixpkgs> { }
, pkgsLinux ? import <nixpkgs> { system = "x86_64-linux"; }
}:
pkgs.dockerTools.buildImage {
  name = "delme";
  tag = "latest";
  contents = pkgs.buildEnv {
    name = "image-root";
    paths = with pkgsLinux; [
      bashInteractive
      coreutils
      curl
    ];
    pathsToLink = [ "/bin" ];
  };
  # Add a new user
  # shadowSetup creates the necessary files to deal with new others
  # like /etc/passwd as documented in
  # https://nixos.org/manual/nixpkgs/stable/#ssec-pkgs-dockerTools-shadowSetup
  runAsRoot = ''
    #!${pkgsLinux.runtimeShell}
    ${pkgsLinux.dockerTools.shadowSetup}
    groupadd -r redis
    useradd -r -g redis redis
  '';
  config = {
    Cmd = [ "${pkgsLinux.bashInteractive}/bin/bash" ];
    User = "redis:redis";
  };
}

필요한 경우 표준 매개변수를 사용하여 uid/gid를 구성할 수 있습니다 useradd.

데모:

$ docker load < $(nix-build test.nix)
Loaded image: delme:latest
$ docker run -ti delme:latest
bash-5.1$ whoami 
redis

추신: nix 커뮤니티는 상대적으로 활발합니다.https://discourse.nixos.org따라서 다음 번에 질문을 하시면 더 빠른 답변을 얻으실 수 있습니다 ;-)

관련 정보