Docker构建报错Unable to locate package libjemalloc1的排查与解决问询
问题原因
你使用的ruby:2.6.5-slim-buster基础镜像对应的Debian 10(Buster)版本官方源已经移除了libjemalloc1包,该版本默认提供的jemalloc runtime包为libjemalloc2,因此会触发找不到包的报错。
验证包是否存在的方法
直接启动对应基础镜像的交互容器,在容器内搜索源内可用包即可:
- 启动容器命令:
docker run --rm -it ruby:2.6.5-slim-buster bash
- 容器内执行搜索命令:
apt update && apt search libjemalloc
返回结果会展示所有源内可用的jemalloc相关包,即可确认libjemalloc1是否存在,以及当前可用的包版本。
可行解决方案
推荐直接使用Debian Buster源提供的libjemalloc2,修改Dockerfile配置即可,改动最小且稳定性有保障:
修改后的完整Dockerfile如下:
FROM ruby:2.6.5-slim-buster RUN apt-get update && apt-get install -y --no-install-recommends libjemalloc2 && rm -rf /var/lib/apt/lists/* ENV LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2
注意:除了替换安装的包名,还需要同步修改
LD_PRELOAD对应的so文件版本号,否则jemalloc无法正常预加载。
验证jemalloc是否生效
镜像构建完成后,启动容器执行以下命令即可验证是否加载成功:
ruby -r rbconfig -e "puts RbConfig::CONFIG['MAINLIBS']"
如果输出内容中包含jemalloc字段,说明集成成功。
内容的提问来源于stack exchange,提问作者queroga_vqz
相关产品推荐
相关产品推荐

