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

使用Nix构建含Git代码检出的容器遇报错及进阶实现咨询

解决Nix容器构建错误并构建Git仓库中的包

一、修复"value is a function while a set was expected"错误

错误原因

fetchGit获取的是源码目录路径,而dockerTools.buildImage的contents参数要求传入Nix包(derivation对象),直接传入源码路径会导致类型不匹配。另外,import (fetchTarball ...)返回的是函数,需要传入参数才能得到完整的pkgs集合。

修正后的代码(Python包构建方式)

let
  pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/15493135c0af2e5562500ab5225f2bd75b38af09.tar.gz") {};

  certbot_dns_namecom = pkgs.pythonPackages.buildPythonPackage rec {
    pname = "certbot-dns-namecom";
    version = "0.1.0"; # 根据仓库实际版本调整
    src = pkgs.fetchGit {
      url = "https://github.com/laonan/certbot-dns-name-com.git";
      ref = "master";
      rev = "cdb98b67e873ee26c9b70593dae23aa19c0df60b";
    };
    propagatedBuildInputs = [ pkgs.pythonPackages.certbot pkgs.pythonPackages.dnspython ];
    # 项目自带setup.py,buildPythonPackage会自动处理安装流程
  };
in rec {
  docker = pkgs.dockerTools.buildImage {
    name = "certbot-namedns";
    contents = [ pkgs.certbot certbot_dns_namecom ];
    config = {
      Cmd = [ "/bin/sh" ];
    };
  };
}

二、基于仓库内Debian构建信息打包

如果需要使用仓库中的Debian构建文件(debian/目录),可以用debianBuildPackage工具构建:

let
  pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/15493135c0af2e5562500ab5225f2bd75b38af09.tar.gz") {};

  certbot_dns_namecom_deb = pkgs.debianBuildPackage {
    pname = "certbot-dns-namecom";
    version = "0.1.0";
    src = pkgs.fetchGit {
      url = "https://github.com/laonan/certbot-dns-name-com.git";
      ref = "master";
      rev = "cdb98b67e873ee26c9b70593dae23aa19c0df60b";
    };
    buildInputs = [ pkgs.build-essential pkgs.debhelper ];
    # 按需添加Debian构建所需的依赖
  };
in rec {
  docker = pkgs.dockerTools.buildImage {
    name = "certbot-namedns";
    contents = [ pkgs.certbot certbot_dns_namecom_deb ];
    config = {
      Cmd = [ "/bin/sh" ];
    };
  };
}

核心要点

  • fetchGit仅拉取源码,必须通过buildPythonPackage/debianBuildPackage等工具将其转换为Nix包后,才能放入容器的contents中
  • 导入nixpkgs时必须传入参数(如空集合{}),因为nixpkgs顶层是一个函数,需要接收系统配置参数才能生成完整的包集合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:15:36