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.
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 🤙🏼