Docker容器启动时无限循环Shell脚本未按预期运行问题求助
问题根因分析
- RUN指令执行时机错误
Dockerfile中的RUN指令仅在镜像构建阶段执行,你配置的后台执行命令只会在build镜像时运行一次,镜像构建完成后相关进程就会被清理,容器启动时完全不会触发脚本执行。你手动进入容器可以正常运行,是因为你手动触发了脚本执行,和构建阶段的RUN配置没有关联。 - 启动逻辑覆盖问题
你注释的ENTRYPOINT直接运行脚本的方案不可行,官方Kibana/ELK镜像自带默认的ENTRYPOINT和CMD逻辑用于启动主服务,直接覆盖ENTRYPOINT会导致要么主服务无法启动,要么脚本执行完成后容器直接退出,无法正常提供服务。 - 脚本潜在语法问题
脚本中if [ '{"success' = $response ]的变量没有加引号,当API请求无返回、$response为空时,会触发shell语法错误导致脚本异常退出。
修复方案
- 首先删除Dockerfile中无效的
RUN nohup bash -c "/etc/elasticsearch/DashBoardImport.sh" >/dev/null 2>&1 &配置 - 新增自定义入口脚本
entrypoint.sh,在不覆盖原有服务启动逻辑的前提下后台运行导入脚本:
#!/bin/bash # 后台执行仪表盘导入脚本 /etc/elasticsearch/DashBoardImport.sh & # 执行原镜像的入口逻辑,启动Kibana主服务 exec /usr/local/bin/kibana-docker "$@"
- 修改Dockerfile配置:
ADD ./CityCountDashBoard.ndjson /etc/elasticsearch/CityCountDashBoard.ndjson ADD ./DashBoardImport.sh /etc/elasticsearch/DashBoardImport.sh ADD ./entrypoint.sh /etc/elasticsearch/entrypoint.sh USER root RUN chmod +x /etc/elasticsearch/*.sh ENTRYPOINT ["/etc/elasticsearch/entrypoint.sh"] # 保留原镜像的默认CMD参数 CMD ["/usr/local/bin/kibana-docker"]
- 可选优化脚本逻辑,避免语法错误,减少不必要输出:
#!/bin/sh # use while loop to check if kibana is running while true do # 加-s参数关闭curl默认输出 response=$(curl -s -X POST elk:5601/api/saved_objects/_import -H "kbn-xsrf: true" --form file=@/etc/elasticsearch/CityCountDashBoard.ndjson | grep -oE "^\{\"success") echo $response # 变量加双引号避免空值报错 if [ '{"success"' = "$response" ] then echo "Running import dashboard.." break else echo "Kibana is not running yet" sleep 5 fi done
内容的提问来源于stack exchange,提问作者mesib
相关产品推荐
相关产品推荐

