Depurando nuestras aplicaciones Spring Boot Dockerizadas

Cuando estamos desarrollando una aplicación, es normal que necesitemos depurar de vez en cuando para ver por qué nos está dando algún error. Sin embargo, cuando lanzamos nuestras aplicaciones en un contenedor Docker no tenemos la opción de lanzar nuestra aplicación en modo debug desde nuestro IDE, como cuando lanzamos una aplicación Spring Boot directamente desde eclipse, ya que para tener acceso al modo debug debe ser a partir de una configuración específica, con un puerto dado.

Vamos a ver cómo podemos configurar nuestra aplicación Spring Boot dockerizada para poder depurarla cuando lo necesitemos.

Lo primero es modificar nuestro pom.xml para indicar a nuestro contenedor que queremos que nuestra aplicación Spring Boot se lance con una serie de parámetros para permitir el modo debug y abrir el puerto 8000 que será por el que nos conectemos para poder depurar.

<plugin>
   <groupId>com.google.cloud.tools</groupId>
   <artifactId>jib-maven-plugin</artifactId>
   <version>${jib-maven-plugin.version}</version>
   <configuration>
	<container>
	       <ports>
	            <port>8080</port>
	            <port>8000</port>
	      </ports>
	      <jvmFlags>
		  <jvmFlag>
                      -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8000
                  </jvmFlag>
              </jvmFlags>    
	</container>
	<from>
	      <image>openjdk:alpine</image>
	</from>
	<to>
	      <image>secdevoops/spring-boot-docker:${project.version}</image>
	</to>
   </configuration>
   <executions>
        <execution>
	        <phase>package</phase>
	        <goals>
	           <goal>build</goal>
	        </goals>
	 </execution>
   </executions>
 </plugin>

Lo que hemos añadido en esta configuración es que hemos abierto el puerto 8000 y hemos añadido las etiquetas <jvmFlag> para añadir las flag de la máquina virtual -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=0.0.0.0:8000.

Es importante indicar el address con la ip 0.0.0.0, ya que si pusieramos localhost (127.0.0.1) sería el localhost del contenedor, por lo que no tendríamos acceso.

Ahora ya podemos construir nuestro contenedor con esta configuración.

$ mvn compile jib:dockerBuild

Lo siguiente es modificar el docker-compose.yml (si es que estamos usando docker-compose) para mapear el puerto 8000.

    expose:
      - 8080
      - 8000
    ports:
      - "8080:8080"
      - "8000:8000"

Una vez tenemos todo configurado, levantamos nuestros servicios y veremos que tenemos el puerto 8000 abierto en nuestro contenedor.

Finalmente, desde Eclipse vamos a conectar a nuestra aplicación para poder depurar. En Eclipse, nos vamos a nuestra aplicación y, con el botón derecho, seleccionamos «Debug As…» y después «Debug Configurations…«. Ahí buscamos la opción «Remote Java Application» e indicamos la siguiente configuración:

Una vez le demos a «Debug«, Eclipse conectará con nuestra aplicación desplegada en Docker y podremos depurar. Podemos abrir la vista de Debug y veremos que la aplicación está corriendo.

Con esto ya solo tenemos que ir poniendo los puntos de ruptura que necesitemos en nuestro código para depurar nuestra aplicación.

Categorías