我正在使用Search Guard插件来保护由多个节点组成的elasticsearch集群。这是我的Dockerfile:
#!/bin/sh
FROM docker.elastic.co/elasticsearch/elasticsearch:5.6.3
USER root
# Install search guard
RUN bin/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 \
bin/init_sg.sh \
&& chown -R elasticsearch:elasticsearch /usr/share/elasticsearch
USER elasticsearch
初始化SearchGuard(创建内部用户并分配角色)。我需要在容器启动后运行脚本init_sg.sh
。问题是:除非elasticsearch正在运行,否则脚本不会初始化任何安全索引。
该脚本的内容是:
sleep 10
plugins/search-guard-5/tools/sgadmin.sh -cd config/ -ts config/truststore.jks -ks config/kirk-keystore.jks -nhnv -icl
现在,我只是在容器启动后手动运行脚本,但因为我在Kubernetes上运行它.Bods可能会被杀死或失败,并由于某种原因自动重新创建。在这种情况下,插件必须在容器启动后自动初始化!
那么如何做到这一点?任何帮助或暗示都会非常感激。
图像本身具有Dockerfile中指定的入口点ENTRYPOINT ["/run/entrypoint.sh"]
。您可以使用自己的脚本替换它。因此,例如创建一个新脚本,安装它并首先调用/run/entrypoint.sh
,然后在运行init_sg.sh
之前等待elasticsearch的启动。
不确定这会解决你的问题,但它值得检查我的repo'sDockerfile
我创建了一个简单的run.sh
文件复制到docker图像和Dockerfile
我写了CMD ["run.sh"]
。以同样的方式在run.sh
中定义你想要的任何东西并写下CMD ["run.sh"]
。您可以在下面找到另一个示例
FROM java:8
RUN apt-get update && apt-get install stress-ng -y
ADD target/restapp.jar /restapp.jar
COPY dockerrun.sh /usr/local/bin/dockerrun.sh
RUN chmod +x /usr/local/bin/dockerrun.sh
CMD ["dockerrun.sh"]
#!/bin/sh
java -Dserver.port=8095 -jar /restapp.jar &
hostname="hostname: `hostname`"
nohup stress-ng --vm 4 &
while true; do
sleep 1000
done
我建议将CMD放入docker文件中,以便在容器启动时执行脚本
FROM debian
RUN apt-get update && apt-get install -y nano && apt-get clean
EXPOSE 8484
CMD ["/bin/bash", "/opt/your_app/init.sh"]
还有其他方法,但在使用这个看你的要求之前,
ENTRYPOINT "put your code here" && /bin/bash
#exemple ENTRYPOINT service nginx start && service ssh start &&/bin/bash "use && to separate your code"
我试图解决确切的问题。这是适合我的方法。
#!/bin/sh
echo ">>>> Right before SG initialization <<<<"
# use while loop to check if elasticsearch is running
while true
do
netstat -uplnt | grep :9300 | grep LISTEN > /dev/null
verifier=$?
if [ 0 = $verifier ]
then
echo "Running search guard plugin initialization"
/elasticsearch/plugins/search-guard-6/tools/sgadmin.sh -h 0.0.0.0 -cd plugins/search-guard-6/sgconfig -icl -key config/client.key -cert config/client.pem -cacert config/root-ca.pem -nhnv
break
else
echo "ES is not running yet"
sleep 5
fi
done
您需要在容器中安装脚本,以便在启动后可以访问它。
COPY sginit.sh /
RUN chmod +x /sginit.sh
您需要编辑入口点脚本或运行ES映像的脚本。这样它就可以在启动ES进程之前在后台启动sginit.sh。
# Run sginit in background waiting for ES to start
/sginit.sh &
这样sginit.sh将在后台启动,并且只会在ES启动后初始化SG。
在后台ES之前启动此sginit.sh脚本的原因是它不会阻止ES启动。如果你在ES启动后把它放在同一个逻辑上,它将永远不会运行,除非你把ES的开头放在后台。