docker 启动 redis 报 `undefined symbol: seccomp_version` 错误的解决办法
通过 docker 部署 redis,启动 docker 时需要依赖 containerd。其实跟 redis 关系不大,主要是 docker 依赖于 containerd。安装完成 docker 启动后可能会遇到如下错误:
1 |
./containerd: symbol lookup error: ./containerd: undefined symbol: seccomp_version |
缺少对应版本的 libseccomp
, 有两种可能:
- 系统没有安装 libseccomp
- 系统安装的 libseccomp 版本不匹配(较低),建议使用 2.4.2
libseccomp 是什么?
libseccomp 是一个 C 语言开发的 Linux 内核系统调用过滤帮助库,很多容器项目都使用到它,比如 containerd、docker、runc 。
libseccomp 安装
因为 containerd 需要依赖的 libseccomp 较新,经过测试,v2.4.2 可以在成功运行,所以我们直接通过源代码来安装。
- 下载源代码
1 |
curl -LO https://github.com/seccomp/libseccomp/releases/download/v2.4.2/libseccomp-2.4.2.tar.gz |
- 解压缩
1 2 |
tar -vxf libseccomp-2.4.2.tar.gz cd libseccomp-2.4.2 |
- 构建
1 |
./configure --prefix=/usr --disable-static |
- 编译安装
1 |
make && make install |
- 通过
whereis libseccomp
查看安装目录
1 |
libseccomp: /usr/lib/libseccomp.so /usr/lib/libseccomp.la |
注意:如果以前使用系统包管理工具安装了低版本的 libseccomp,即使通过编译安装最新版本,还是会报错。
这是因为引用路径的优先级的缘故,其 containerd 还是使用了老版本,故需要先删除系统包管理安装的老版本,删除命令根据操作系统的类别而定,比如 Centos 可以使用 yum remove libseccomp
。当安装了 v2.4.2 的 libseccomp 后, 我们再次运行 docker,报错信息消失,docker 服务启动成功。