Debian 8升级至Debian 9后Docker seccomp报错求助
解决Debian 9下Docker Build/Run的Seccomp过滤错误
问题分析
从你的描述和docker info输出来看,核心问题出在内核版本不匹配:你当前使用的是Debian 8的3.16.0-7-amd64内核,升级到Debian 9后没有同步更新内核。而Docker 18.09的默认seccomp profile包含了该旧内核不支持的系统调用(比如clone3),导致加载过滤规则时触发invalid argument错误。虽然docker run可以通过--seccomp=unconfined临时绕过,但docker build不支持该参数,之前修改daemon.json失败大概率是因为配置的profile与内核不兼容。
解决方案
1. 升级内核到Debian 9官方版本(推荐)
这是最彻底的解决办法,Debian 9默认提供4.9系列内核,完全支持Docker 18.09的seccomp规则:
- 执行命令升级内核:
sudo apt update && sudo apt install linux-image-amd64 linux-headers-amd64 - 重启系统后,验证内核版本:
输出应为uname -r4.9.x-amd64,此时再运行docker run或docker build就不会出现seccomp错误了。
2. 使用兼容旧内核的Seccomp Profile(临时过渡)
如果暂时无法重启升级内核,可以替换Docker的全局seccomp profile为适配3.16内核的版本:
- 创建兼容的profile文件,比如
/etc/docker/seccomp-3.16.json,可以使用Docker 17.06版本的默认profile(该版本对旧内核兼容性更好,移除了3.16不支持的系统调用)。 - 修改
/etc/docker/daemon.json:{ "seccomp-profile": "/etc/docker/seccomp-3.16.json" } - 重启Docker守护进程:
这次守护进程应该能正常启动,且sudo systemctl restart dockerdocker build也不会再报错。
3. 全局禁用Seccomp过滤(不推荐,不安全)
如果只是临时测试场景,可以完全关闭seccomp过滤,但会降低容器安全性:
- 修改
/etc/docker/daemon.json:{ "seccomp-profile": "unconfined" } - 重启Docker:
此方法会让所有容器(包括build过程)跳过seccomp过滤,快速解决错误,但不建议在生产环境使用。sudo systemctl restart docker
补充验证
确认内核seccomp支持正常:
grep CONFIG_SECCOMP= /boot/config-$(uname -r)
输出CONFIG_SECCOMP=y说明内核本身支持seccomp,问题仅在于profile与内核版本不匹配。
内容的提问来源于stack exchange,提问作者aljoshare




