Docker中Elasticsearch启动后自动执行Search Guard init_sg.sh脚本
我最近刚好碰到了一模一样的需求——想让Elasticsearch容器启动后自动跑Search Guard的初始化脚本init_sg.sh,不想每次都手动敲docker exec去执行。下面是我踩过的坑、尝试过的配置,以及最终搞定的方案,也欢迎大家分享其他可行的思路~
需求背景
目标是容器启动后自动执行Search Guard的init_sg.sh初始化脚本,无需人工介入。
最初的尝试配置
我先写了一个自定义的entrypoint.sh:
#! /bin/sh elasticsearch source init_sg.sh
对应的Dockerfile是这样的:
FROM docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.0 COPY config/ config/ COPY bin/ bin/ # 安装并配置Search Guard插件 RUN elasticsearch-plugin install --batch com.floragunn:search-guard-6:6.1.0-20.1 \ && chmod +x \ plugins/search-guard-6/tools/hash.sh \ plugins/search-guard-6/tools/sgadmin.sh \ && chown -R elasticsearch config/sg/ \ && chmod -R go= config/sg/ # 替换默认entrypoint为自定义脚本 ENTRYPOINT ["bash","-c","entrypoint.sh"]
遇到的问题
结果运行容器时直接炸了,抛出权限错误:
org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root
特别纳闷的是,如果Dockerfile里用默认的CMD ["elasticsearch"]就完全没问题,查了一些相关方案也没解决——容器里根本找不到他们提到的/run/entrypoint.sh文件。
最终可行的解决方案
折腾了好一阵,终于找到了能正常工作的自定义entrypoint脚本:
source init_sg.sh while [ $? -ne 0 ]; do sleep 10 source init_sg.sh done & /bin/bash -c "source /usr/local/bin/docker-entrypoint.sh;"
这个脚本的核心思路是:
- 先后台循环尝试执行初始化脚本(因为Elasticsearch启动需要时间,第一次执行大概率会失败,所以循环重试)
- 然后调用官方的entrypoint脚本启动Elasticsearch——官方脚本会自动切换到
elasticsearch用户,完美规避了root权限的问题
这样既实现了初始化脚本自动运行的需求,又没有破坏官方镜像的权限管理逻辑。
欢迎大家提供其他替代解决方案!
内容的提问来源于stack exchange,提问作者RedGiant
相关产品推荐
相关产品推荐

