El Problema de Java Google cloud y docker
Problema
conseguir un jar listo para ser contenido en un docker, capaz de conectarse a una base de datos cloud sql, para luego ir a cloud register y crear algo con kubermates.
Ejecución en local, uno puede poner el path de las credenciales de servicio que tengan cliente sql dentro de de application.properties. y así conseguir una conexión local.
spring.datasource.username=userspring.datasource.password=passspring.jpa.hibernate.ddl-auto=update
spring.cloud.gcp.sql.database-name=basespring.cloud.gcp.sql.instance-connection-name=projec-it:us-central1:instancia-sql
#spring.cloud.gcp.sql.credentials.location=file:./src/main/resources/key.json#spring.cloud.gcp.sql.credentials.location=file:key.jsonEstrategía de las credenciales u cualquier otro archivo.
-
hacer que tome el archivo ??
-
crear variable desde el contenedor.
El objetivo es empaquetar el jar para que pueda ser contenido.
- funciona en local
mvn spring-boot
ok funciona ! si hay conexión, como compilo significa que paso las pruebas y si hay conexión.
- funciona al compilar y empaquetar el jar=
mvn clean package :
No ni siquiera compila no hay conexión con la base. no encuentra las credenciales. ya que las busca en la computadora, como absoluta, sin embargo necesito que busque adentro del .jar porque si estan adentro.
- claasspath ayuda
No funciona, funcionaría con otra propiedad pero no en spring al parecer hay un bug, relacionado a la biblioteca no puede leer desde adentro
https://github.com/spring-cloud/spring-cloud-gcp/issues/339
Opciones reales para la credencial de servicio.
- Opciones: leer desde local
¿Que tal si apunto a un ruta afuera del jar donde ya se que va a estar el archivo?
spring.cloud.gcp.sql.credentials.location=file
Vale entonces compilo saltandome las pruebas para que no de error
mvn package -DskipTests
coloco el archivo key.json justo en mi raiz,
/key.json
/target/name-spring-app.jar
Ejecuto
java -jar target/name-spring-app.jar
Funciona encontró las credenciales y ya esta empquetado, ahora tengo que hacer un docker para que tenga sentido.
FROM openjdk:14-slim-buster
COPY ./target/gae-gnp-covid-0.0.1-SNAPSHOT.jar /usr/src/app/app.jarCOPY ./src/main/resources/key.json /usr/src/app/key.json
WORKDIR /usr/src/app
ENTRYPOINT java -jar app.jary al crear y ejecutar el docker
docker build -t app_java .docker run -it -p 8080:8080 java_appFunciona si tiene conexión aunque tuve algunas advertencias quizá no es la mejor manera aún
- bueno crear variable de google auth. que tome la default y ya esta.
Eliminar la línea de cuenta de servicio para que tome la default en el sistema significa que debe haber una default hay que guardarla en algún lugar el contenedor y expornter la variable de ambiente.
FROM openjdk:14-slim-buster
COPY ./target/gae-gnp-covid-0.0.1-SNAPSHOT.jar /usr/src/app/app.jar
COPY ./src/main/resources/key.json /usr/src/app/key.json
ENV GOOGLE_APPLICATION_CREDENTIALS="/usr/src/app/key.json"
WORKDIR /usr/src/app
ENTRYPOINT java -jar app.jarAhora como lo mando a kubernates.
Comando para crear el cluster 1 nodo qa.
¿Como entrar al contenedor?