虽然无限循环 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。
我有如下所示的 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。