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" ];
};
}
これは機能しますが、結果のイメージはrootとして実行されます。この例を拡張して root 以外のユーザー (特定の 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
PS:nixコミュニティは比較的活発です。https://discourse.nixos.orgしたがって、次回質問をするとより速い答えを得ることができます;-)