【问题标题】:How to use chown in Nix derivations?如何在 Nix 派生中使用 chown?
【发布时间】:2020-08-27 03:56:52
【问题描述】:

我正在尝试打包脚本以在 Nix 派生中使用 git push 执行部署。 目标是在 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 配置以及 David 的建议:https://github.com/framp/nixos-configs/blob/master/painpoint

【问题讨论】:

  • 有点题外话:记住,shell 必须添加到environment.shells

标签: nix nixos


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢!这就说得通了。包装改变状态的东西的惯用方式是什么?只需将功能公开为脚本,以便在首次启动时手动运行以进行设置?
  • 我不确定它是多么地道,但我看到 NixOS 管理员使用system.activationScripts 来设置目录和更改权限。它似乎是一个 Nix 集合,集合中的值是字符串,它们连接在一起形成一个 shell 脚本,然后以 root 身份运行。
  • @framp 我一直在处理同样的问题。我的想法是创建一个脚本,(1)检查目录是否存在; (2) 必要时创建; (3) 回显目录名称。
猜你喜欢
  • 1970-01-01
  • 2019-11-17
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 2021-09-20
  • 2023-03-19
相关资源
最近更新 更多