Descripción

dockerized-dcm4chee2.18.3 es una imagen de contenedor Docker creada para ejecutar dcm4chee2.18.3 con persistencia para almacenar la configuración y los archivos dicom. La base de datos se asume instanciada en otro lugar.

Tiene pre-instalado el visualizador Weasis de manera que se puede observar el estudio desde el acceso web.

Se actualizó el plugin libclib_jiio a su ultima versión (1.2.0-b04) que mejora el bug de memory leak al comprimir en jpeg2000 aunque no lo soluciona de manera definitiva. Mas información sobre esto aquí.

Se equipó esta imagen con el demonio cron ejecutado en segundo plano, pues es posible realizar tareas de mantenimiento sobre el contenedor de manera automática, como puede ser eliminación de logs o reinicio de servicio como por ejemplo por los problemas de memory leak al usar compresión de imágenes.

Funcionamiento

Iniciar un nuevo contenedor sin persistencia

Esta instancia es absolutamente de prueba, pues cualquier configuración o archivo enviado será eliminado al finalizar el contenedor.

docker run --rm --name nombre_contenedor -d opendicom/dcm4chee-2.18.3:<tag>

Persistencia

Esta imagen admite persistir varios componentes. Se utilizan los volúmenes de docker para ello. La elección del tipo de volumen (bind, named) depende de cada instalación y/o preferencia de uso.

Configuración de dcm4chee

El directorio /opt/dcm4chee/server/default es donde se guarda la configuración de dcm4chee-2.18.3. Para persistir estos datos, es necesario utilizar un volumen de tipo Named Volume ya que al iniciar el contenedor por primera vez se deben copiar los datos de configuración al nuevo volumen. Esta "copia" NO funciona con un volumen de tipo Bind.

Repositorio DICOM

Por defecto dcm4chee configura el repositorio de archivos dicom en el directorio /opt/dcm4chee/server/default/archive. Utilizando un volumen en este directorio se persiste el repositorio.

Iniciar un nuevo contenedor con persistencia

Este ejemplo asume tener 1 directorio creado previamente para repositorio dicom.

/data/archive/
docker run --name nombre_contenedor -d \
	-v /data/archive:/opt/dcm4chee/server/default/archive/ \
	-v dcm4chee_vol:/opt/dcm4chee/server/default/ \
	opendicom/dcm4chee-2.18.3:<tag>

Nótese la diferencia entre los volúmenes. El primer volumen es de tipo Bind y el segundo Named volume.

Cron

Cron por defecto busca cambios en /etc/crontaby /etc/cron.d/* cuando detecta un cambio en alguno de los archivos actualiza su lista de tareas a memoria para ejecutar las mismas cuando corresponda. Este comportamiento funciona a la perfección desde un sistema operativo completo, pero puede fallar desde algunos contenedores, es decir cuándo hay un cambio en un archivo de configuración cron no lo detecta y por lo tanto no instala la nueva tarea en memoria.

Por tal motivo dockerized-dcm4chee2.18.3 maneja cron con cierta peculiaridad. Existe un archivo /crontab_file quien contiene la configuración de cron deseada. Cada vez que el contenedor es creado carga la configuración de este archivo a memoria. Si este archivo es cambiado luego de que el contenedor inició será necesario cargar manualmente a memoria la configuración o reiniciar el contenedor.

Cargar la configuración cron de forma manual

Para cargar de forma manual la configuración de cron luego que modificó el archivos /crontab_file

docker exec -it nombre_contenedor bash
crontab /crontab_file

Log de tareas

Para ver la salida de las tareas es necesario redirigir stdin y stdout hacia el proceso con pid 1. De esta forma podremos observar los logs con el comando de Docker

docker logs nombre_contenedor

Para redirigir las salidas, en el archivo /crontab_file debemos agregar la tarea programada de la siguiente forma:

0 1 * * * /scripts/s1.sh > /proc/1/fd/1 2>/proc/1/fd/2

Nótese en este caso la salida de las tareas quedaran mezcladas con la salida de dcm4chee

Iniciar un nuevo contenedor con persistencia y cron

Asumimos que existe el archivo /host/path/crontab_file en el host docker y que tiene una configuración de cron adecuada.

docker run --name nombre_contenedor -d \
    -v /data/archive:/opt/dcm4chee/server/default/archive/ \
	-v dcm4chee_vol:/opt/dcm4chee/server/default/ \
    -v /host/path/crontab_file:/crontab_file
	opendicom/dcm4chee-2.18.3:<tag>

Variables de Entorno

Se puede ajustar la conexión a la base de datos desde variables de entorno. Cada vez que el contenedor inicia comprueba estas variables y ajusta la configuración.

MYSQL_HOST

Variable opcional. Valor por defecto: localhost. Especifica el nombre/ip del servidor de base de datos. En caso que sea otro contenedor deber ser el nombre de éste. Si se instancia desde un docker-compose.yml puede ser tanto el nombre del servicio o el del contenedor.

MYSQL_PORT

Variable opcional. Valor por defecto 3306 Especifica el puerto donde corre el motor de base de datos mysql.

MYSQL_DATABASE

Variable opcional. Valor por defecto pacsdb Especifica el nombre de la base de datos que utilizará dcm4chee-2.18.3

MYSQL_USER

Variable opcional. Valor por defecto pacs Especifica el nombre de usuario que utiliza dcm4chee-2.18.3 para la conexión a la base de datos

MYSQL_PASSWORD

Variable opcional. Valor por defecto pacs Especifica la contraseña que utiliza dcm4chee-2.18.3 para la conexión a la base de datos

MYSQL_CONNECT_RETRY

Variable opcional. Valor por defecto 30 Cuando el contenedor inicia y antes de arrancar dcm4chee-2.18.3 comprueba la conexión a la base de datos, si falla repite la comprobación cada MYSQL_CONNECT_RETRY segundos hasta que se establezca la conexión.

JAVA_OPTS

Variable opcional. Determina la configuración del servidor de aplicaciones jboss utilizado por dcm4chee-2.18.3. Podrías necesitar modificar los valores dcm4chee.nodename,Xms y Xmx de la siguiente forma:

JAVA_OPTS: "-Ddcm4che.archive.nodename=DCM4CHEE -Xms512m -Xmx1024m -XX:MaxPermSize=128m -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"

Docker-compose

El archivo docker-compose.yml en este repo presenta la configuración necesaria para iniciar una nueva instancia de dockerized-dcm4chee-2.18.3. Tenga en cuenta que necesita los siguientes 2 archivos extras create-mysql.sql y crontab_file