Contenerización de un servicio java para hacer un file-upload 🌱 + 🐳 spring-boot y docker

La idea es realizar un proyecto con spring-boot para generar un servicio REST que nos ayude a subir imágenes a un folder que puede ser un volumen persistente.

spring

Esto se vuelve muy útil si tienes que subir algún archivo como una imagen a un volumen que sera común para varios pods o contenedores ya que se expondrán los endpoints para, subir, eliminar, visualizar y listar.

El code de este proyecto lo puedes encontrar acá: https://github.com/xRegner/api-upload-files-spring

git clone https://github.com/xRegner/api-upload-files-spring.git

Dedicaremos un espacio para explicar el código, por ahora nos vamos a centrar en crear el contenedor, ejecutarlo y probar su funcionamiento en postman.

FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
RUN mkdir upload-dir
ARG JAR_FILE=./*.jar
COPY ${JAR_FILE} app.jar
CMD ["java","-jar","/app.jar"]

Básicamente estamos usando la imagen base de `openjdk:8-jdk-alpine` y vamos a crear un usuario y un grupo con el cual va a correr nuestro contenedor, vamos a crear dentro del contenedor una carpeta que usaremos para capear como volumen y finalmente vamos a pasar el .jar dentro para ejecutar nuestra app.

Una vez que se clona el repo, se debe ejecutar los siguiente.

cd thc-upload-files-java
mvn clean package 
cp Dockerfle target/
cd target 
docker build -t thc-upload-images-local .
docker run -ti -d  -p 8080:8080 --restart=always -v $(pwd)/upload:/upload-dir/ \ 
       --name local-files-thc thc-upload-images-local
 .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.4.RELEASE)

2021-02-26 17:52:49.115  INFO 3851 --- [           main] c.t.c.f.FileUploadApplicationTests       : Starting FileUploadApplicationTests on xtian.local with PID 3851 (started by xtian in /Users/xtian/tmp-api-upload-files/api-upload-files-spring)
2021-02-26 17:52:49.117  INFO 3851 --- [           main] c.t.c.f.FileUploadApplicationTests       : No active profile set, falling back to default profiles: default
2021-02-26 17:52:49.844  INFO 3851 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2021-02-26 17:52:50.020  INFO 3851 --- [           main] c.t.c.f.FileUploadApplicationTests       : Started FileUploadApplicationTests in 1.307 seconds (JVM running for 1.988)
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.962 s - in com.techinc.common.fileupload.FileUploadApplicationTests
2021-02-26 17:52:50.348  INFO 3851 --- [extShutdownHook] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

Ahora que ya tenemos el .jar docker se encargará de crear la imagen en tu maquina y correr el contenedor y estaremos listos para exponerla por el puerto 8080.

ya que esta corriendo nuestro container podemos ir a postman y probar los siguientes endpoints:

Now you will be able to use postman to call: POST  http://localhost:8080/api/uploadFile/folder-imgs –> “folder-imgs” is a mandatory path variable, this endpoint sotore a file GET http://localhost:8080/api/getFiles –> Get all files GET http://localhost:8080/api/files/folder-imgs/sample.jpg –> display an stored image DELETE http://localhost:8080/api/deleteFile/uploadFile/sample.jpg –> delete a file

Nota “folder-imgs” puede ser remplazado por algún texto que haga referencia a las imágenes o archivos que se quieren subir.

Acá la colección de postman.

Espero te sirva.

Saludos 🤙🏼