Nixを使用してDockerイメージをビルドするときにroot以外のユーザーを追加する方法

Nixを使用してDockerイメージをビルドするときにroot以外のユーザーを追加する方法

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したがって、次回質問をするとより速い答えを得ることができます;-)

おすすめ記事