Consejo sobre microservicio spring boot en docker y twitter api

T

Buenas,

tengo un microservicio con Spring Boot que recoge tweets de Twitter. El caso es que el consumer key, consumer secret, etc, que son necesarios para acceder a la api de twitter los tengo en el application.properties del proyecto. No creo que sea el mejor sitio para tenerlo ,¿no?. ¿Me podríais decir como se suele manejar esto y cómo debería plantearlo con vistas a subirlo a github?

Otra cosa es que tengo el microservicio desplegado en docker, junto con kafka y demás. ¿Hay alguna forma de hacer que al iniciar el contenedor de docker, automaticamente cree el .jar del proyecto y lo inicie? Lo he intentado todo y me da problemas al ejecutar el .jar, porque dice que no encuentra la clase main. He probado con varios plugins para hacer el build del jar pero nada...

docker-compose.yml

java:
    container_name: java-microservice
    build:
      context: .
      dockerfile: docker/java/Dockerfile
    image: ms-twitter:latest
    ports:
      - 5111:5111
    depends_on:
      - check-ksql-db-started
    networks:
      - elk

Dockerfile

FROM    maven:3.8.2-jdk-11 AS build
RUN     mkdir /docker
WORKDIR /docker
COPY    pom.xml /docker
COPY 	src /docker
COPY 	.classpath /docker
COPY 	.project /docker
RUN 	mvn install shade:shade


FROM openjdk:18-jdk-alpine
COPY --from=build /docker/target/proyecto-0.0.1-SNAPSHOT-jar-with-dependencies.jar /ms-twitter.jar
EXPOSE 5111
ENTRYPOINT ["java","-jar","/ms-twitter.jar"]

Gracias
Un saludo

pineda

para la api key y consumer secret puedes usar secret de docker, o un ficherito .env (metelo en el gitignore) de forma que este no lo subas a git, y que setee las variables de entorno. Tienes muchas opciones, spring boot permite multitud de formas de cargar y sobreescribir variables

si te da el error de que no encuentra la clase es porque te falta en el pom.xml el maven-jar-plugin

 <build>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.2</version>
            </plugin>
        </plugins>
    </build>

no recuerdo si con esto es suficiente, o también deberás añadir el mainClass dentro de la configuración del plugin

1 1 respuesta
T

#2 Muchas gracias, haré lo del .env. En cuanto a lo otro, también da error con ese plugin, aun añadiendo el mainClass. He probado con otros plugins y me sigue dando error, por lo que veo da bastantes problemas crear un .jar con docker. A ver si alguien tiene alguna solución :/

1 respuesta
pineda

#3 el problema no debe ser docker. Si lo intentas generar en local tendrás el mismo error. Deberías probarlo

prueba cambiando el plugin por este otro

<plugin>   
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> </plugin>
1 respuesta
T

#4 Es que en local sí me funciona, me lo genera y lo ejecuta sin problema. En docker sin embargo no. También he probado ese plugin y nada...

JuAn4k4

No será otra versión que no es la 0.0.1 ? Eso tienes que quitarlo y hardcodear el nombre del jar. Que usas para hacer el shade ? Deberías usar mvn package creo, no vaya a ser…

Para las settings usa environment variables.

hda

Es más seguro meterlo en secrets que en env. En env estará expuesto completamente si te comprometen el contenedor.

wdaoajw

En producción lo más típico es que el secret viva en vault o similar y el microservicio lo cargue al inicio.

Para tu docker-compose, puedes probar con los secrets de docker, aunque no recuerdo si esto ya está soportado por compose o solo por docker swarm

1 respuesta
hda

#8 está complemente integrado en compose. Confirmo yo que es lo que tengo montado.

T

Gracias por las respuestas, probaré a hacerlo con secrets de docker entonces. Con respecto al tema de generar el jar, no me ha funcionado nada, así que finalmente he tirado de un plugin llamado Jib, de google, que con un solo comando hace build del proyecto y crea una imagen del jar y me funciona perfectamente. Puedes crearla tanto local como subirla a Dockerhub.

Usuarios habituales