You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;"

这个脚本的核心思路是:

  1. 先后台循环尝试执行初始化脚本(因为Elasticsearch启动需要时间,第一次执行大概率会失败,所以循环重试)
  2. 然后调用官方的entrypoint脚本启动Elasticsearch——官方脚本会自动切换到elasticsearch用户,完美规避了root权限的问题

这样既实现了初始化脚本自动运行的需求,又没有破坏官方镜像的权限管理逻辑。

欢迎大家提供其他替代解决方案!

内容的提问来源于stack exchange,提问作者RedGiant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:45:43