首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Docker容器启动后自动运行脚本

如何在Docker容器启动后自动运行脚本
EN

Stack Overflow用户
提问于 2017-12-06 10:05:44
回答 6查看 96.8K关注 0票数 27

我使用搜索保护插件来保护由多个节点组成的elasticsearch集群。这是我的Dockerfile:

代码语言:javascript
复制
#!/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正在运行,否则脚本将不会初始化任何安全索引。

该脚本的内容如下:

代码语言:javascript
复制
sleep 10
plugins/search-guard-5/tools/sgadmin.sh -cd config/ -ts config/truststore.jks -ks config/kirk-keystore.jks -nhnv -icl

现在,我只是在容器启动后手动运行脚本,但是因为我在Kubernetes上运行它。由于某些原因,豆荚可能会被杀死或失败,并会被自动重新创建。在这种情况下,插件必须在容器启动后自动初始化!

那么,如何做到这一点呢?任何帮助或暗示都将不胜感激。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-12-06 10:18:25

映像本身有一个在Dockerfile中指定的入口点ENTRYPOINT ["/run/entrypoint.sh"]。你可以用你自己的脚本代替它。因此,例如,创建一个新脚本,挂载它,然后首先调用/run/entrypoint.sh,然后在运行init_sg.sh之前等待elasticsearch的启动。

票数 21
EN

Stack Overflow用户

发布于 2017-12-06 10:20:29

不确定这能解决你的问题,但是值得检查一下我的存储库Dockerfile

我创建了一个简单的run.sh文件,复制到docker映像中,并在Dockerfile中编写了CMD ["run.sh"]。以同样的方式在run.sh中定义您想要的任何内容,并编写CMD ["run.sh"]。您可以找到另一个示例,如下所示

Dockerfile

代码语言:javascript
复制
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"]

dockerrun.sh

代码语言:javascript
复制
#!/bin/sh
java -Dserver.port=8095 -jar /restapp.jar &
hostname="hostname: `hostname`"
nohup stress-ng --vm 4 &
while true; do
  sleep 1000
done
票数 6
EN

Stack Overflow用户

发布于 2019-04-17 02:50:43

我正试着解决这个问题。这是对我有用的方法。

  1. 创建一个单独的shell脚本,以检查ES状态,并且只在ES准备就绪时才启动SG的初始化:

Shell脚本

代码语言:javascript
复制
#!/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

在Dockerfile中安装脚本

您需要在容器中安装脚本,以便在脚本启动后可以访问它。

代码语言:javascript
复制
COPY sginit.sh /
RUN chmod +x /sginit.sh

更新入口点脚本

您需要编辑ES映像的入口点脚本或运行脚本。因此,在启动ES进程之前,它将在后台启动sginit.sh。

代码语言:javascript
复制
# Run sginit in background waiting for ES to start
/sginit.sh &

这样,sginit.sh将在后台启动,并且只在ES启动后初始化SG。

在背景ES之前启动这个sginit.sh脚本的原因是,它不会阻止ES启动。同样的逻辑也适用于如果您将它放在ES启动后,它将永远不会运行,除非您将ES的开始放在背景中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47671589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档