Ibmmq Docker容器运行报错找不到MQ C库问题求助
问题背景
运行引入ibmmq npm包的NodeJS应用,服务通过该包实现IBM MQ消息消费。原有Dockerfile构建的镜像已稳定运行6个月,近期容器启动持续报错。
原有Dockerfile内容如下:
STAGE1: BUILD FROM node:16.13.2-bullseye-slim AS base WORKDIR /app COPY package*.json ./ COPY tsconfig.json ./ COPY src ./src RUN echo $(ls -1 ./) RUN echo $(ls -1 ./src)= RUN apt-get update && apt-get install --yes curl g++ make git python3 RUN npm install RUN npm run app-build COPY . . STAGE2: RELEASE FROM node:16.13.2-bullseye-slim AS release WORKDIR /app COPY --from=base /app/build/src ./src COPY --from=base /app/node_modules ./node_modules COPY --from=base /app/package*.json ./ COPY --from=base /app/tsconfig.json ./ CMD node src/index.js
报错信息
容器启动时输出如下错误,持续重启:
container is backing off waiting to restart -dev:pod/---5dbc6cd9c8-x48tj: container is backing off waiting to restart [ -5dbc6cd9c8-x48tj ] Cannot find MQ C library. [ -5dbc6cd9c8-x48tj ] Has the C client been installed? [ -5dbc6cd9c8-x48tj ] Have you run setmqenv? failed. Error: container is backing off waiting to restart.
相关依赖版本
node_modules/ibmmq版本信息:{ "version": "0.9.18", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "ffi-napi": ">=4.0.3", "ref-array-di": ">=1.2.2", "ref-napi": "^3.0.3", "ref-struct-di": ">=1.1.1", "unzipper": ">=0.10.11" } }
根因分析
报错核心是ibmmq包运行时无法加载依赖的IBM MQ C客户端动态库,触发原因有三点:
ibmmq@0.9.18版本的安装后脚本默认会自动拉取对应版本的MQ C客户端存到node_modules目录,近期IBM官方调整了旧版客户端的下载访问规则,自动拉取流程静默失败,之前能正常运行是因为旧构建缓存留存了之前下载成功的库文件,近期构建缓存失效后就会出现库文件缺失。- 原有多阶段构建的release阶段使用
slim基础镜像,缺少MQ C客户端运行必需的系统级动态依赖(libgcc、libstdc++、libkrb5、libicu等),就算库文件存在也会因为动态链接依赖缺失无法加载。 - 构建流程没有配置MQ库的查找路径,动态链接器无法扫描到非系统默认路径下的MQ库文件。
修复方案
按以下步骤调整Dockerfile即可解决问题:
- 构建阶段不要依赖包的自动脚本拉取MQ客户端,手动下载和
ibmmq@0.9.18兼容的9.3.0.0 LTS版本IBM MQ C客户端重分发包,解压到固定路径/opt/mqm,避免下载规则变动导致的拉取失败。 - release阶段先安装MQ客户端运行必需的系统依赖,执行安装命令后清理apt缓存减小镜像体积:
apt-get update && apt-get install -y --no-install-recommends libgcc-s1 libstdc++6 libkrb5-3 libicu67 ca-certificates && rm -rf /var/lib/apt/lists/* - 将构建阶段解压好的
/opt/mqm目录完整拷贝到release镜像的相同路径,不要仅依赖node_modules内存储的库文件。 - release阶段配置全局环境变量,指定MQ安装路径、动态库查找路径,保证运行时能正常扫描到C库:
ENV MQ_INSTALLATION_PATH=/opt/mqm ENV LD_LIBRARY_PATH=/opt/mqm/lib64:$LD_LIBRARY_PATH ENV PATH=/opt/mqm/bin:$PATH - 若不需要固定旧版本,可直接将
ibmmq升级到最新稳定版,新版本已修复客户端拉取的静默失败问题,会自动校验下载完整性。
修正后可用Dockerfile参考
# STAGE1: BUILD FROM node:16.13.2-bullseye-slim AS base WORKDIR /app # 安装构建依赖,提前部署固定版本MQ C客户端 RUN apt-get update && apt-get install --yes --no-install-recommends curl g++ make git python3 ca-certificates \ && mkdir -p /opt/mqm # 将提前下载好的9.3.0.0-IBM-MQC-Redist-LinuxX64.tar.gz放置到构建上下文目录,拷贝后解压即可,避免公网源变动影响构建 COPY 9.3.0.0-IBM-MQC-Redist-LinuxX64.tar.gz /tmp/ RUN tar -xf /tmp/9.3.0.0-IBM-MQC-Redist-LinuxX64.tar.gz -C /opt/mqm \ && rm -f /tmp/9.3.0.0-IBM-MQC-Redist-LinuxX64.tar.gz \ && rm -rf /var/lib/apt/lists/* COPY package*.json ./ COPY tsconfig.json ./ COPY src ./src RUN npm install RUN npm run app-build COPY . . # STAGE2: RELEASE FROM node:16.13.2-bullseye-slim AS release WORKDIR /app # 安装运行时系统依赖 RUN apt-get update && apt-get install -y --no-install-recommends libgcc-s1 libstdc++6 libkrb5-3 libicu67 ca-certificates \ && rm -rf /var/lib/apt/lists/* # 拷贝MQ客户端文件 COPY --from=base /opt/mqm /opt/mqm # 拷贝应用构建产物 COPY --from=base /app/build/src ./src COPY --from=base /app/node_modules ./node_modules COPY --from=base /app/package*.json ./ COPY --from=base /app/tsconfig.json ./ # 配置MQ运行环境变量 ENV MQ_INSTALLATION_PATH=/opt/mqm ENV LD_LIBRARY_PATH=/opt/mqm/lib64:$LD_LIBRARY_PATH ENV PATH=/opt/mqm/bin:$PATH CMD ["node", "src/index.js"]
构建完成后可进入容器执行dspmqver命令,若能正常输出MQ客户端版本信息,即说明C库加载正常,不会再触发找不到库的报错。
内容的提问来源于stack exchange,提问作者Prabhat Mishra
相关产品推荐
相关产品推荐

