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따라서 다음 번에 질문을 하시면 더 빠른 답변을 얻으실 수 있습니다 ;-)