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

问题描述

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

解决方法

我正在使用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上运行它的。由于某些原因,吊舱可能会被杀死或失败,并会自动重新创建。在这种情况下,必须在容器启动后自动初始化插件!

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

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”