Estoy tratando de ejecutar un pod con 2 contenedores. El contenedor principal ejecuta una imagen docker java que ejecuta el trabajo cron y el otro contenedor sidecar (logstash) lee el registro y lo envía al servidor Kibana. Como el contenedor principal se completa una vez que finaliza el trabajo cron, pero el contenedor sidecar sigue ejecutándose ya que no se apaga correctamente. Probé https://github.com/karlkfi/kubexit y preStop container lifecycle hook pero no funcionó. Ahora, quiero intentar detener el contenedor sidecar usando dockerfile. Docker ENTRYPOINT exec java image jar y una vez que finaliza el proceso de java, quería crear/tocar un archivo dentro del contenedor principal que mi otro contenedor sidecar busca ese archivo tocado.
Este es mi dockerfile actual
FROM mcr.microsoft.com/java/jre:11-zulu-alpine ARG projectVersion WORKDIR /opt/example/apps/sync COPY /target/sync-app-${projectVersion}.jar app.jar ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jarQuería agregar lo siguiente una vez que se complete la ejecución del proceso Java
echo "Going to kill sync-app container..." trap 'touch /opt/example/apps/sync/container/done' EXITRealmente quería saber si es posible ejecutar el comando anterior una vez que finalice la ejecución de ENTRYPOINT. (puede agregar estos comandos en un script y pasar ese script al PUNTO DE ENTRADA). Pero no estoy seguro de qué se requiere para agregar esos comandos para ejecutarlos correctamente.
El código que tengo para el contenedor logstash que buscaría el archivo (que es creado por el primer contenedor)
- args: - | dockerd-entrypoint.sh & while ! test -f /opt/example/apps/sync/container/done; do echo "Waiting for sync-app to finish..." sleep 5 done echo "sync-app finished, exiting" exit 0 command: - /bin/sh - -cPor favor, hágamelo saber si se requiere más información. ¡Gracias por toda la ayuda de antemano!
Puede esperar a que el proceso finalice según el PID del proceso. El intérprete de bash tiene un comando incorporado llamado wait donde, si se llama con un PID secundario como argumento, esperará hasta que el secundario haya terminado.
Entonces puede crear el siguiente entrypoint.sh y agregarlo a su contenedor Java.
punto de entrada.sh
#!/bin/bash echo "Cleaning the file signal and running the entrypoint" rm -rf /opt/example/apps/sync/container/done exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar & child_pid=$! echo "Process started, waiting for the exit" wait $child_pid echo "Entrypoint exited, signaling the file" touch /opt/example/apps/sync/container/donePuede montar un EmptyDir tanto en su contenedor principal como en el sidecar.
El contenedor principal escribe un archivo en una ubicación determinada donde este directorio vacío se monta como la última declaración en su punto de entrada justo antes de que salga, y el sidecar tiene un bucle que verifica la existencia de este mismo archivo.
Una vez que se detecta, el contenedor sidecar sale 0;
Es un poco hacky, pero debería hacer el trabajo.
En una nota al margen, Docker y Kubernetes tienen algunos valores predeterminados sobre cómo manejar los registros. Los recopilan de STDOUT de cada contenedor y almacenan la salida en un archivo en el nodo que ejecuta el contenedor (/var/lib/docker/containers). Logstah podría configurarse como un daemonset ejecutándose en cada uno de estos nodos con la ubicación de registros de contenedores montada como hostPath y seguir los archivos mencionados anteriormente. De esta manera, sus contenedores no requieren ningún sodecar y, en mi opinión, simplifica la configuración general, dejando a logstash la responsabilidad de hacer lo que sea necesario con el registro.