How can I run script automatically after Docker container startup How can I run script automatically after Docker container startup kubernetes kubernetes

How can I run script automatically after Docker container startup


The image itself has an entrypoint ENTRYPOINT ["/run/entrypoint.sh"] specified in the Dockerfile. You can replace it by your own script. So for example create a new script, mount it and first call /run/entrypoint.sh and then wait for start of elasticsearch before running your init_sg.sh.


Not sure this will solves your problem, but its worth check my repo'sDockerfile

I have created a simple run.sh file copied to docker image and in the Dockerfile I wrote CMD ["run.sh"]. In the same way define whatever you want in run.sh and write CMD ["run.sh"]. You can find another example like below

Dockerfile

FROM java:8RUN 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/shjava -Dserver.port=8095 -jar /restapp.jar &hostname="hostname: `hostname`"nohup stress-ng --vm 4 &while true; do  sleep 1000done


I was trying to solve the exact problem. Here's the approach that worked for me.

  1. Create a separate shell script that checks for ES status, and only start initialization of SG when ES is ready:

Shell Script

#!/bin/shecho ">>>>  Right before SG initialization <<<<"# use while loop to check if elasticsearch is running while truedo    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    fidone

Install script in Dockerfile

You will need to install the script in container so it's accessible after it starts.

COPY sginit.sh /RUN chmod +x /sginit.sh

Update entrypoint script

You will need to edit the entrypoint script or run script of your ES image. So that it starts the sginit.sh in the background BEFORE starting ES process.

# Run sginit in background waiting for ES to start/sginit.sh &

This way the sginit.sh will start in the background, and will only initialize SG after ES is started.

The reason to have this sginit.sh script starts before ES in the background is so that it's not blocking ES from starting. The same logic applies if you put it after starting of ES, it will never run unless you put the starting of ES in the background.