Red Hat Fuse 7容器执行client命令触发除零错误求助
解决Red Hat Fuse 7 Docker容器中Client的/ by Zero错误
问题分析
从你提供的错误日志来看,这个/ by zero异常来自org.aesh.readline.Buffer.printInsertedData方法,本质是终端尺寸获取失败导致的计算错误。因为你使用的openjdk:8-slim是精简版镜像,缺少了终端环境必需的依赖库,导致Fuse的Karaf客户端无法正确获取终端的列宽/行高,进而触发除零异常。
解决方案
方案1:补充镜像的终端依赖库(推荐)
修改你的Dockerfile,添加终端相关依赖包,确保容器内可以正确识别终端环境:
FROM openjdk:8-slim MAINTAINER Jayashankar C <jshankarc1@gmail.com> # 添加终端依赖库 RUN apt-get update && apt-get install -y --no-install-recommends ncurses-base libtinfo5 \ && rm -rf /var/lib/apt/lists/* ENV KARAF_USER karaf ENV KARAF_UID 8181 ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64 ENV JAVA_MAX_MEM 256m ENV KARAF_EXEC exec COPY fuse-karaf-7.0.0.fuse-000191-redhat-1.zip /tmp/fuse-karaf.zip COPY org.ops4j.pax.url.mvn.cfg /tmp COPY users.properties /tmp RUN groupadd -r $KARAF_USER --gid=$KARAF_UID && useradd -rm -g $KARAF_USER --uid=$KARAF_UID $KARAF_USER RUN mkdir -p /opt/karaf \ && unzip -o /tmp/fuse-karaf.zip -d /opt/karaf \ && mv /opt/karaf/fuse-karaf-7.0.0.fuse-000191-redhat-1/* /opt/karaf > /dev/null 2>&1 \ && ls /opt/karaf -ltr \ && rm /tmp/fuse-karaf.zip \ && cp -f /tmp/org.ops4j.pax.url.mvn.cfg /opt/karaf/etc \ && cp -f /tmp/users.properties /opt/karaf/etc \ && cat /opt/karaf/etc/org.ops4j.pax.url.mvn.cfg \ && mkdir -p /opt/karaf/data /opt/karaf/data/log \ && chown -R $KARAF_USER.$KARAF_USER /opt/karaf \ && chmod 700 /opt/karaf/data EXPOSE 1099 8101 44444 USER $KARAF_USER CMD ["/opt/karaf/bin/karaf", "run"]
重新构建镜像并启动容器后,终端环境就能正常识别,客户端按键异常的问题会消失。
方案2:临时强制设置终端尺寸(无需修改镜像)
如果不想重新构建镜像,可以在执行客户端命令前手动指定终端的行和列:
# 先进入容器的bash环境,设置终端尺寸后启动client docker exec -it fuse bash stty rows 24 cols 80 /opt/karaf/bin/client
或者直接用一条命令完成:
docker exec -it fuse sh -c "stty rows 24 cols 80 && /opt/karaf/bin/client"
方案3:传递终端环境变量启动容器
启动容器时指定TERM环境变量,帮助容器识别终端类型:
docker run --name fuse -d -p 1099:1099 -p 8101:8101 -p 44444:44444 -e TERM=xterm-256color redhat-fuse-v1
之后再执行docker exec -it fuse /opt/karaf/bin/client即可正常使用客户端。
内容的提问来源于stack exchange,提问作者Jayashankar
相关产品推荐
相关产品推荐

