¡Hola! ¿Alguna vez ste has preguntado desplegar aplicaciones Delphi dentro de un contenedor de Windows Docker? ¿Y cómo depurarlas una vez que están dentro del contenedor?  ¡Estás en en lugar adecuado!  Voy a explicarte cómo ejecutar un contenedor de Windows Docker con PAServer en marcha, listo para depurar sus aplicaciones.

Esto puede ser útil cuando:

  • Tu servicio/app/… funciona muy bien, pero falla estrepitosamente cuando lo ejecutas en un contenedor y necesitas depurarlo
  • Quieres desplegar de forma rápida y sucia tu servicio/app/… en un contenedor, sin la molestia de escribir un Dockerfile

Recuerda que en los contenedores de Windows no tiene GUI, por lo que sólo puedes ejecutar aplicaciones tipo servicio (no VCL, no Firemonkey…).

La manera rápida

Para seguir este tutorial necesitarás:

Ok, vamos alla! Sigue estos pasos:

  • Ejecuta Docker para Windows
  • En el menú contextual: Switch to Windows Containers
  • Abre PowerShell y ejecutq:
    • docker pull jaruzafa/paserverwindows
    • docker run -d -h mypaserver jaruzafa/paserverwindows
  • Ahora ya tienes un contenedor de Windows Docker ejecutando PAServer en el puerto predeterminado (64211) en el host “mypaserver”
  • Arranca RadStudio y abre tu proyecto (o un proyecto de consola en blanco para probar)
  • Haz clic con el botón derecho en Target Platform de destino (Windows 32 o 64) y selecciona “Properties
  • En el combo “Profile” selecciona “Add new…
    • Nombre de host: mypaserver
    • Puerto: 64211
    • Sin contraseña
  • Importante! Si su Target Platform Windows 32 Asegúrese de que: Project->Options->Delphi compiler->Linking->Include remote debug symbols->TRUE (sino te dará un error en algún momento)
  • Clic en Aceptar y pon un breakpoint en el código.
  • Ejecuta con debug (o presiona F9) y espere hasta que legue al breakpoint:)
  • Disfruta de la vida

Este vídeo muestra todos los pasos:

Detalles técnicos

Así que quieres saber lo que está pasando para personalizarlo para tus propias necesidades, ¿verdad? Bien, me encanta tu actitud. Vamos a echar un vistazo a lo que necesita para depurar aplicaciones Delphi en un contenedor.

La imagen

En primer lugar, necesitamos construir una imagen con Windows y PAServer instalado y ejecutándose. Este Dockerfile hará el trabajo:

FROM microsoft/windowsservercore
ADD install_paserver.bat /paserver/install_paserver.bat
ADD http://altd.embarcadero.com/releases/studio/19.0/PAServer/Release2/setup_paserver.exe /paserver
WORKDIR /paserver
RUN install_paserver.bat
EXPOSE 64211
CMD ["/Program Files (x86)/Embarcadero/PAServer/19.0/paserver.exe"]

Se descarga el paquete de instalación de PAServer desde los servidores de Embarcadero, lo instala, expone el puerto 64211 e inicia paserver. exe bastante sencillo ¿no te parece? Pero espera… ¿Qué es ese install_paserver. bat? ¿por qué no llama directamente a setup_paserver. exe? Por alguna razón (que desconozco), setup_paserver. exe devuelve un código de error = 1, cuando se ejecuta en modo silencioso. Ese código de error rompe la construcción de la imagen de Docker, así que se me ocurrió un install_paserver. bat que fuerza el código de error a 0:

setup_paserver.exe -i silent
exit /b 0

¡Hasta ahora, bien! Sólo queda construir la imagen (atención al punto ‘. ‘ al final, es importante):

docker build -t paserverwindows .

Después de un rato tendrás la imagen de Docker. Se llamará “paserverwindows”.

El contenedor

Ahora que tienes la imagen, tu siguiente paso es ejecutarlo:

docker run -d -h mypaserver paserverwindows

En RadStudio

Eso es todo. Funciona como un proyecto de depuración remota normal y corriente. Puedes nombrar el contenedor con un nombre de host usando el parámetro -h. Si quieres configurar tu PAServer con una contraseña o un puerto personalizado, tendras que copiar un archivo de configuración. Si necesitas más información, ve a la documentación de PAServer.

Reflexiones finales

  • Los fuentes están diponibles en https://github.com/jaruzafa/paserver-dockerwin
  • Desafortunadamente, no pude usar la imagen de microsoft/nanoserver (sólo 1GB de tamaño) porque carece de tiempo de ejecución de 32 bits, necesario para PAServer.
  • También puedes ejecutar el contenedor en modo interactivo con:
    • docker run -i -h mypaserver jaruzafa/paserverwindows
    • Pero…. la interfaz de la consola no se actualiza bien y al final no es utilizable. No he encontrado una solución a esto, pero si la encuentras, por favor deja un comentario.

Espero que hayas disfrutado este post tanto como yo he disfrutado escribiéndolo. Comentarios, errores y reflexiones, son bienvenidos 🙂