如何在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
相关产品推荐
相关产品推荐

