禁用BPF_SYSCALL的NixOS系统下,如何让Docker-Compose不触发BPF调用?
环境与问题详情
当前NixOS系统内核的BPF_SYSCALL已禁用,内核配置信息如下:
[root@nixos:/sys/fs/cgroup]# zgrep BPF /proc/config.gz CONFIG_BPF=y CONFIG_HAVE_EBPF_JIT=y CONFIG_ARCH_WANT_DEFAULT_BPF_JIT=y # BPF subsystem # CONFIG_BPF_SYSCALL is not set CONFIG_BPF_JIT=y CONFIG_BPF_JIT_DEFAULT_ON=y # end of BPF subsystem CONFIG_IPV6_SEG6_BPF=y # CONFIG_NETFILTER_XT_MATCH_BPF is not set # CONFIG_BPFILTER is not set CONFIG_NET_CLS_BPF=m CONFIG_NET_ACT_BPF=m CONFIG_LWTUNNEL_BPF=y
启动ChirpStack的Docker-Compose时出现以下错误:
May 05 00:38:45 nixos bash[13245]: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting cgroup config for procHooks process: bpf_prog_query(BPF_CGROUP_DEVICE) failed: function not implemented: unknown
由于无法修改内核,需找到让Docker-Compose不触发BPF调用的方法。
可行解决方案
1. 修改Docker守护进程配置,切换cgroup驱动并调整命名空间模式
编辑Docker守护进程配置文件/etc/docker/daemon.json(不存在则创建),添加以下内容:
{ "cgroupns-mode": "host", "exec-opts": ["native.cgroupdriver=cgroupfs"] }
保存后重启Docker服务:
systemctl restart docker
该配置会让Docker使用传统cgroupfs驱动(而非依赖BPF的systemd驱动),同时让容器共享主机cgroup命名空间,避免触发BPF相关的cgroup配置调用。
2. 在Docker-Compose文件中单独配置容器cgroup参数
若不想全局修改Docker配置,可在docker-compose.yml中为每个ChirpStack相关容器添加cgroupns: host配置,示例:
services: chirpstack: image: chirpstack/chirpstack:latest cgroupns: host # 其他原有配置... chirpstack-gateway-bridge: image: chirpstack/chirpstack-gateway-bridge:latest cgroupns: host # 其他原有配置...
3. 临时禁用容器资源限制配置(若适用)
如果Docker-Compose文件中为容器设置了CPU、内存等资源限制,这类限制可能触发Docker使用BPF管理cgroup。可尝试注释掉资源限制配置,验证是否能正常启动:
services: chirpstack: # 注释资源限制配置 # deploy: # resources: # limits: # cpus: '0.5' # memory: 512M
内容的提问来源于stack exchange,提问作者Uma Mahesh

