虽然无限循环 SH 在 docker 启动时无法按预期工作

while infinite loop SH does not work as expected on docker startup

我有如下所示的 sh 代码 (DashBoardImport.sh)。它检查 api 响应以无限循环导入 kibana 仪表板,如果它获得成功的响应,它会中断循环:

#!/bin/sh
# use while loop to check if kibana is running 
while true
do
    response=$(curl -X POST elk:5601/api/saved_objects/_import -H "kbn-xsrf: true" --form file=@/etc/elasticsearch/CityCountDashBoard.ndjson | grep -oE "^\{\"success")
    #curl -X GET elk:9200/git-demo-topic | grep -oE "^\{\"git"  > /dev/null
    #match=$?
    echo $response
    if [ '{"success' = $response ]
        then
            echo "Running import dashboard.."
            #curl -X POST elk:5601/api/saved_objects/_import -H "kbn-xsrf: true" --form file=@/etc/elasticsearch/CityCountDashBoard.ndjson
            break
        else
            echo "Kibana is not running yet"
            sleep 5
    fi
done

我 运行 DashBoardImport.sh 通过 docker 文件:

ADD  ./CityCountDashBoard.ndjson /etc/elasticsearch/CityCountDashBoard.ndjson
ADD  ./DashBoardImport.sh /etc/elasticsearch/DashBoardImport.sh
#ENTRYPOINT /etc/elasticsearch/DashBoardImport.sh &  

USER root

RUN chmod +x /etc/elasticsearch/DashBoardImport.sh
#RUN /etc/elasticsearch/DashBoardImport.sh &
RUN nohup bash -c "/etc/elasticsearch/DashBoardImport.sh" >/dev/null 2>&1 &

我尝试了很多选项,您可以看到注释掉了。当我在 Docker 容器上手动 运行 时,sh 工作得很好。我终止了 kibana 服务。然后 运行 代码。在我启动 kibana 之后,代码按预期成功运行并导入了仪表板。但是当它在容器上自动启动时它不起作用。

你有什么想法吗?

提前致谢:)

RUN 步骤在临时容器中执行,直到命令 returns 然后 docker 将文件系统的更改捕获为映像中的新层。没有其他任何东西,没有环境变量,运行宁进程等,只有文件系统发生变化。

所以当你 RUN nohup ... & 那个进程立即 returns 因为它在后台(nohup ... & 明确地这样做),所以容器退出,杀死任何进程 运行ning 在容器中,并捕获对图像所做的文件系统更改(如果有)。

如果您想要在启动容器时 运行 某些内容,请将其添加到您的 ENTRYPOINT 或 CMD。