Te doy la bienvenida a nuestra página web, ahora hallarás la resolución que estabas buscando.
Solución:
La imagen en sí tiene un punto de entrada. ENTRYPOINT ["/run/entrypoint.sh"]
especificado en el Dockerfile. Puede reemplazarlo por su propio script. Entonces, por ejemplo, cree un nuevo script, móntelo y llame primero /run/entrypoint.sh
y luego espere el inicio de elasticsearch antes de ejecutar su init_sg.sh
.
No estoy seguro de que esto resuelva su problema, pero vale la pena revisar mis repositoriosDockerfile
he creado un sencillo run.sh
archivo copiado a la imagen acoplable y en el Dockerfile
escribí CMD ["run.sh"]
. De la misma manera define lo que quieras en run.sh
y escribe CMD ["run.sh"]
. Puedes encontrar otro ejemplo como el siguiente
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
Estaba tratando de resolver el problema exacto. Aquí está el enfoque que funcionó para mí.
- Cree un script de shell separado que verifique el estado de ES y solo inicie la inicialización de SG cuando ES esté listo:
Guión de concha
#!/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
Instalar script en Dockerfile
Deberá instalar el script en el contenedor para que sea accesible después de que se inicie.
COPY sginit.sh /
RUN chmod +x /sginit.sh
Actualizar script de punto de entrada
Deberá editar el script de punto de entrada o ejecutar el script de su imagen ES. Para que inicie sginit.sh en segundo plano ANTES de iniciar el proceso ES.
# Run sginit in background waiting for ES to start
/sginit.sh &
De esta manera, sginit.sh se iniciará en segundo plano y solo inicializará SG después de que se inicie ES.
La razón por la que este script sginit.sh se inicia antes que ES en segundo plano es para que no bloquee el inicio de ES. Se aplica la misma lógica si lo coloca después de iniciar ES, nunca se ejecutará a menos que coloque el inicio de ES en segundo plano.