Docker容器启动报错top: unrecognized option: /的原因排查
错误原因及解决办法
为什么会报错?
Docker中ENTRYPOINT与CMD同时存在时,若ENTRYPOINT采用数组格式(exec形式),CMD的内容会被当作ENTRYPOINT命令的参数传递。
你这里的ENTRYPOINT ["top", "-b"]是exec格式,而CMD ls -lisa bin | grep kafka-s属于shell格式,Docker会自动将CMD转换为["/bin/sh", "-c", "ls -lisa bin | grep kafka-s"],最终容器启动时执行的命令变为:
top -b /bin/sh -c "ls -lisa bin | grep kafka-s"
BusyBox的top命令无法识别/bin/sh这类参数,它把第一个斜杠判定为无效选项,因此抛出unrecognized option: /的错误。删除CMD行后,ENTRYPOINT直接执行top -b,符合命令的标准用法,容器就能正常运行了。
解决办法
根据你的实际需求选择以下两种方案:
若需要启动容器时先执行ls命令,再运行top
编写启动脚本start.sh:#!/bin/sh # 先执行目标ls命令 ls -lisa bin | grep kafka-s # 用exec启动top,确保信号能传递到top进程 exec top -b然后修改Dockerfile:
FROM eclipse-temurin:17-jre-alpine LABEL authors="sort-architectures" WORKDIR /app/kafka COPY ./kafka-3.5.1-src . COPY start.sh . RUN chmod +x start.sh ENTRYPOINT ["./start.sh"]若只是验证文件是否存在,无需在容器启动时执行
将ls命令移至构建阶段的RUN指令,这样构建镜像时就会执行该命令,不会影响容器启动:FROM eclipse-temurin:17-jre-alpine LABEL authors="sort-architectures" WORKDIR /app/kafka COPY ./kafka-3.5.1-src . RUN ls -lisa bin | grep kafka-s ENTRYPOINT ["top", "-b"]
内容的提问来源于stack exchange,提问作者camilajenny
相关产品推荐
相关产品推荐

