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

我使用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(创build内部用户并分配angular色)。 我需要在容器启动后运行脚本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可能会因为某种原因被杀死或失败并自动重新创build。 在这种情况下,插件必须在容器启动后自动初始化!

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

它自身的映像在Dockerfile中指定了入口点ENTRYPOINT ["/run/entrypoint.sh"] 。 你可以用你自己的脚本replace它。 因此,例如创build一个新脚本,首先调用/run/entrypoint.sh ,然后在运行init_sg.sh之前等待弹性search的开始。

不知道这会解决你的问题,但它的价值检查我的回购的Dockerfile

我已经创build了一个简单的run.sh文件复制到docker图像,并在我写的CMD ["run.sh"]Dockerfile 。 以同样的方式在run.sh定义你想要的,并写入CMD ["run.sh"] 。 你可以find像下面的另一个例子

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 

我build议把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"