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

新手上路,请多包涵

我正在使用 Search Guard 插件来保护由多个节点组成的弹性搜索集群。这是我的 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 上运行它。Pod 可能会被杀死或失败并由于某种原因自动重新创建。在这种情况下,插件必须在容器启动后自动初始化!

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

原文由 PhiloJunkie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

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

原文由 Jonathan Lechner 发布,翻译遵循 CC BY-SA 4.0 许可协议

不确定这是否能解决您的问题,但值得检查我的 回购 Dockerfile

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

Dockerfile

 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

 #!/bin/sh
java -Dserver.port=8095 -jar /restapp.jar &
hostname="hostname: `hostname`"
nohup stress-ng --vm 4 &
while true; do
  sleep 1000
done

原文由 Veerendra K 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题