如何在Nix衍生版本中使用chown?

问题描述 投票:0回答:1

我想打包一个脚本,在Nix派生版本中使用git推送来执行部署。post-receive 运行一些操作。

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

我已经建立了一个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 在构建或安装阶段设置所有权,我假设是因为构建过程中的隔离。

有办法克服这个问题吗?我不知道我得到的问题是否是一个信号,我错过了一些明显的东西或误用工具.从包中写在家里可能是另一种代码气味:我这样做是为了有一个更好的URL添加到git中。git remote add server git@mydomain:test.git)

谢谢你

EDIT:我把我的nixos配置和David的建议一起上传到这里。https:/github.comframpnixos-configsblobmasterpainpoint。

nix nixos
1个回答
2
投票

一般来说,据我所知,Linux 没有办法把文件的所有权交给另一个用户,除非你是根用户。

其次,我质疑你为什么要让你的派生输出中的文件被另一个用户拥有。 正如在 Nix手册,在建立派生后,Nix将所有文件的模式设置为0444或0555,这意味着它们将被系统中的所有用户读取,有些也将被系统中的所有用户执行。 你的用户应该不需要额外的权限。

记住,Nix派生的输出应该是一个永不改变的东西。

© www.soinside.com 2019 - 2024. All rights reserved.