You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器启动时无限循环Shell脚本未按预期运行问题求助

问题根因分析
  • RUN指令执行时机错误
    Dockerfile中的RUN指令仅在镜像构建阶段执行,你配置的后台执行命令只会在build镜像时运行一次,镜像构建完成后相关进程就会被清理,容器启动时完全不会触发脚本执行。你手动进入容器可以正常运行,是因为你手动触发了脚本执行,和构建阶段的RUN配置没有关联。
  • 启动逻辑覆盖问题
    你注释的ENTRYPOINT直接运行脚本的方案不可行,官方Kibana/ELK镜像自带默认的ENTRYPOINT和CMD逻辑用于启动主服务,直接覆盖ENTRYPOINT会导致要么主服务无法启动,要么脚本执行完成后容器直接退出,无法正常提供服务。
  • 脚本潜在语法问题
    脚本中if [ '{"success' = $response ]的变量没有加引号,当API请求无返回、$response为空时,会触发shell语法错误导致脚本异常退出。
修复方案
  1. 首先删除Dockerfile中无效的RUN nohup bash -c "/etc/elasticsearch/DashBoardImport.sh" >/dev/null 2>&1 &配置
  2. 新增自定义入口脚本entrypoint.sh,在不覆盖原有服务启动逻辑的前提下后台运行导入脚本:
#!/bin/bash
# 后台执行仪表盘导入脚本
/etc/elasticsearch/DashBoardImport.sh &
# 执行原镜像的入口逻辑,启动Kibana主服务
exec /usr/local/bin/kibana-docker "$@"
  1. 修改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"]
  1. 可选优化脚本逻辑,避免语法错误,减少不必要输出:
#!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:36:10