如何在 Nix 推导中使用 chown?

How to use chown in Nix derivations?

我正在尝试打包一个脚本,以在 Nix 派生中使用 git 推送来执行部署。 目标是在 post-receive 运行 一些操作上有一个 git 回购协议。

我想将它打包,这样我就可以将它与我的配置放在一起并轻松发布,从而最大限度地减少手动任务的数量。

我已经设置了一个 git 用户:

users.users.git = {
    isNormalUser = true;
    shell = "/run/current-system/sw/bin/git-shell";
    home = "/home/git";
    openssh.authorizedKeys.keys = [
      ...
    ];
  };

我的推导是这样的:

with import <nixpkgs> {};
let setupGitRepo = name : (
stdenv.mkDerivation {
  name = "setup-git-repo";
  dontUnpack = true;
  buildInputs = [
    git
  ];
  buildPhase = ''
git init --bare ${name}.git
mkdir -p ${name}.git/hooks
touch ${name}.git/hooks/post-receive
tee ${name}.git/hooks/post-receive <<EOF
GIT="/home/git/${name}.git"
WWW="/var/www/${name}"
TMP="/tmp/${name}"
ENV="/home/git/${name}.env"
rm -rf $TMP
mkdir -p $TMP
git --work-tree=$TMP --git-dir=$GIT checkout -f
cp -a $ENV/.* $TMP
cd $TMP
# install deps, etc
rm -rf $WWW/*
mv $TMP/* $WWW/*
# restart services here
rm -rf $TMP
EOF 
  '';
  installPhase = ''
    mkdir -p $out/var/www/${name}
    mkdir -p $out/home/git
    mkdir -p $out/home/git/${name}.env
    chown -R git:users ${name}.git # doesn't work
    chown -R git:users $out/var/www/${name} # doesn't work
    cp -R ${name}.git $out/home/git
  '';
});
in setupGitRepo "test"

我的问题是我无法使用 chown git:users 在构建或安装阶段设置所有权,我假设是因为构建过程中的隔离。

有办法克服这个问题吗? 我想知道我遇到的问题是否表明我遗漏了一些明显的东西或滥用了工具。 从包中写入 /home 可能是另一种代码味道:我这样做是为了有一个更好的 url 添加到 git git remote add server git@mydomain:test.git)

谢谢

编辑:我将根据大卫的建议上传我的 nixos 配置:https://github.com/framp/nixos-configs/blob/master/painpoint

一般来说,据我所知,Linux 无法将文件的所有权授予其他用户,除非您是 root。

其次,我质疑为什么您甚至希望派生输出中的文件由不同的用户拥有。如Nix manual所述,在构建推导后,Nix 将所有文件的模式设置为 0444 或 0555,这意味着它们将被系统上的所有用户读取,有些也将被系统上的所有用户执行。系统。您的用户应该不需要任何其他权限。

请记住,Nix 推导的输出应该是永远不会改变的不可变事物。