Hace algunos años que dejé de desarrollar software de manera profesional, pues aunque en mi trabajo mis funciones siguen estando en el área de TI, son a un nivel más ejecutivo, sin embargo, como buenos Líderes TI, nunca debemos dejar de aprender. Este no es un tutorial desde cero sobre docker y supone que un conocimiento básico de gradle.
Para mantener la simplicidad del ejercicio, vamos a crear una imagen docker con una sencilla app en kotlin que haga el Hola Mundo, pero no compilaremos la app kotlin dentro del contenedor, más bien desplegaremos la app ya empaquetada.
Usaremos gradle para crear la app kotlin
❯ mkdir hola-kotlin
❯ cd hola-kotlin
❯ gradle init --dsl kotlin
Starting a Gradle Daemon (subsequent builds will be faster)
Select type of project to generate:
1: basic
2: application
3: library
4: Gradle plugin
Enter selection (default: basic) [1..4] 2
Select implementation language:
1: C++
2: Groovy
3: Java
4: Kotlin
5: Scala
6: Swift
Enter selection (default: Java) [1..6] 4
Ahora vamos a validar que nuestro magnífico Hola Mundo funciona correctamente!
❯ ./gradlew run
> Task :app:run
Hello World!
BUILD SUCCESSFUL in 3s
Como mencionamos, vamos a mandar la app ya empaquetada a nuestra imagen docker, es decir que no vamos compilar ni bajar dependencias desde la imagen. Por lo tanto vamos a empaquetar la app en un TAR
❯ ./gradlew distTar
Ahora, si miramos dentro de app/build/distributions ahi estará nuestro archivo tar
Vamos a crear nuestro archivo Dockerfile de una capa base que contenga una versión reducida de la JRE ya que no vamos a compilar nada, recordemos que vamos a mandar nuestra app ya compilada.
# Debido a que no vamos a compilar (pues ya lo hicimos) solo a ejecutar, usaremos una versión ligera de la JRE
FROM openjdk:8-jre-alpine
# Creamos un directorio /kotlin dentro de nuestra imagen
RUN mkdir /kotlin
# Descomprimimos en la carpeta /kotlin que creamos arriba, el tar que generamos previamenre con ./gradlew distTar
ADD app/build/distributions/app.tar /kotlin
# WORKDIR es como hace un comando cd, es decir, nos pasamos a /kotlin/app
WORKDIR /kotlin/app
# Ejecutamos la app
CMD ["bin/app"]
Hasta este punto, nuestra estructura de carpetas debe ser similar a esto:
.
├── Dockerfile
├── app
├── build
├── gradle
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
Nuestro último paso es compilar la imagen docker, así que para ello ejecutamos docker build
y posteriormente validamos que nuestra imagen ha sido creada:
❯ docker build -t app-kotlin .
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
app-kotlin latest b5e01d6c2363 18 minutes ago 89.7MB
Ahora solo corremos con docker run
❯ docker run --rm app-kotlin
En otros tutoriales escribiré como conectar con una BD Mongo, donde obviamente la base de datos estará en otro contenedor independiente.