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

标签 bash docker docker-compose dockerfile search-guard

我正在使用 this docker repository安装 elasticsearchsearchguard

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

我不喜欢每次重新创建容器时手动运行 docker exec -it elasticsearch bin/init_sg.sh。我正在寻找一种在 Dockerfiledocker-compose.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

最佳答案

检查流程似乎不是检查 Elasticsearch 是否准备就绪的好方法。

我建议使用 elastic-search 的 REST api 进行更好的替代。

api 在端口 9200 上公开。有一个 official healthcheck script用于 Elasticsearch 。健康检查使用命令 curl -fsSL "http://$host:9200/_cat/health?h=status 如果 elastic-search 健康,它将返回绿色。

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

关于bash - 在 docker 容器中的主要服务完全加载后运行 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47374853/

相关文章:

mongodb - 我如何在Docker上运行MongoDB分片? MongoDB分片在Docker上不起作用

postgresql - 使用 Airflow 的 postgres 数据库作为应用程序数据

git - 为什么 'git ls-files' 没有在 Tab 完成时显示?

arrays - Bash 将数组传递给函数插入空元素

bash - 为什么 bash eval 在后台命令失败时返回零?

docker - 从.gitlab-ci.yml升级rancher服务

linux - 仅用于开发的 Docker

regex - 修剪长文件名的名称[重命名]

macos - osx上缺少docker0接口(interface)

wordpress - 为什么我需要在 docker-compose.yml 中显式声明 env 文件?