You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nix中创建派生复制指定文件,供dockerTools.buildImage使用?

解决Nix派生中cp找不到文件的问题

你的代码存在两个核心问题,导致cp命令找不到目标文件:

  • 跳过了unpackPhase,本地的./目录没有被复制到Nix的沙盒构建环境中,$src指向的路径在构建环境里不存在
  • $out目录默认未创建,直接复制文件到$out会因目标目录不存在失败

修正方案一(推荐,使用默认流程)

保留默认的unpackPhase,让Nix自动将本地目录内容解压到构建环境,同时提前创建$out目录:

database = pkgs.stdenv.mkDerivation {
  name = "database";
  src = ./.; # 用Nix路径而非字符串,避免路径解析问题
  # 无需手动指定phases,默认会执行unpackPhase、installPhase等流程
  installPhase = ''
    mkdir -p $out
    # 当前目录已是unpack后的src内容,直接复制文件
    cp .env $out/
    cp 20221002.sqlite $out/
  '';
};

修正方案二(自定义phases场景)

如果必须自定义phases,需要手动将src内容复制到构建环境:

database = pkgs.stdenv.mkDerivation {
  name = "database";
  src = ./.;
  phases = [ "buildPhase" "installPhase" ];
  buildPhase = ''
    # 手动把src目录内容复制到当前构建目录
    cp -r $src/* .
  '';
  installPhase = ''
    mkdir -p $out
    cp .env $out/
    cp 20221002.sqlite $out/
  '';
};

关键说明

  • 使用./.(Nix原生路径)代替字符串"./",Nix会自动处理路径引用,避免沙盒内路径解析错误
  • 无论哪种方案,都必须先执行mkdir -p $out确保输出目录存在

内容的提问来源于stack exchange,提问作者Alper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:37:39