在docker容器中的主服务完全加载后运行bash脚本

在docker容器中的主服务完全加载后运行bash脚本,bash,docker,docker-compose,dockerfile,search-guard,Bash,Docker,Docker Compose,Dockerfile,Search Guard,我正在使用安装elasticsearch和searchguard searchguard需要在elasticsearch完全加载后运行脚本bin/init_sg.sh 我不喜欢每次重新创建容器时手动运行docker exec-it elasticsearch bin/init_sg.sh。我正在寻找一种在Dockerfile或dockercompose.yml中以编程方式实现它的方法 我现在的主要问题是在dockerfile中查找主进程pid,并确保elasticsearch服务已完全加载。有人

我正在使用安装
elasticsearch
searchguard

searchguard需要在elasticsearch完全加载后运行脚本
bin/init_sg.sh

我不喜欢每次重新创建容器时手动运行
docker exec-it elasticsearch bin/init_sg.sh
。我正在寻找一种在
Dockerfile
dockercompose.yml
中以编程方式实现它的方法

我现在的主要问题是在dockerfile中查找主进程pid,并确保elasticsearch服务已完全加载。有人能给我一些建议吗

不成功的Dockerfile

FROM docker.elastic.co/elasticsearch/elasticsearch:5.6.3

COPY config/ config/
COPY bin/ bin/

# Search Guard plugin
# https://github.com/floragunncom/search-guard/wiki
RUN elasticsearch-plugin install --batch com.floragunn:search-guard-5:5.6.3-16 \
    && chmod +x \
        plugins/search-guard-5/tools/hash.sh \
        plugins/search-guard-5/tools/sgadmin.sh

# Add your elasticsearch plugins setup here
# Example: RUN elasticsearch-plugin install analysis-icu

CMD bin/elasticsearch && while [ -d /proc/1 ] ; do sleep 1; done && bin/init_sg.sh

检查流程似乎不是检查弹性搜索是否就绪的好方法

我建议使用弹性搜索的RESTAPI提供更好的选择

api在端口
9200
上公开。有一种弹性搜索的方法。运行状况检查使用命令
curl-fsSL“http://$host:9200/_cat/health?h=status
,如果弹性搜索正常,该命令将返回绿色


您可以使用相同的api并等待绿色状态,然后执行
init_sg.sh
脚本。

最好检查9200端口是否打开(例如使用nc),因为REST api受到限制,并且只要searchguard未初始化,您就无法登录。