使用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
相关产品推荐
相关产品推荐

