¿A quién no le ha pasado que está desarrollando un precioso ejemplo usando una imagen de IRIS de Docker y le ha fallado el proceso de generación de la imagen en el Dockerfile porque la licencia con la que se creo la imagen no contiene determinados privilegios?
En mi caso lo que estaba desplegando en Docker es una pequeña aplicación que utiliza el tipo de datos Vectorial. Con la versión Community esto no es un problema porque ya incluye el Vector Search y el almacenamiento vectorial, pero al cambiar la imagen de IRIS por un IRIS convencional (el latest-cd) me encontré que en el momento de construir la imagen incluyendo las clases que había generado esta me retornaba este error:
9.505 ERROR #15806: Vector Search not permitted with current license
9.505 > ERROR #5030: An error occurred while compiling class 'Inquisidor.Object.LicitacionOS'
9.505 Compiling class Inquisidor.Object.Licitacion
9.505 ERROR #15806: Vector Search not permitted with current license
9.505 > ERROR #5030: An error occurred while compiling class 'Inquisidor.Object.Licitacion'
9.538 Compiling class Inquisidor.Message.LicitacionResponse
Este error me dejó despistado, porque yo, como persona obediente, había definido en mi docker-compose.yml el parámetro que indica donde se encuentra mi licencia válida:
iris:
init: true
container_name: iris
build:
context: .
dockerfile: iris/Dockerfile
ports:
- 52774:52773
- 51774:1972
volumes:
- ./iris/shared:/iris-shared
environment:
- ISC_DATA_DIRECTORY=/iris-shared/durable
command: --check-caps false --ISCAgent false --key /iris-shared/iris.key
Me llevó un rato comprender que el problema es la imagen originaria que estaba usando, y no la licencia que tenía yo, cómo podéis ver, no soy el lápiz más afilado del estuche.
El problema estaba en el punto en el que importaba mis clases a la imagen de IRIS por defecto:
RUN \
zn "%SYS" \
do ##class(SYS.Container).QuiesceForBundling() \
do ##class(Security.Users).UnExpireUserPasswords("*") \
set sc=##class(%SYSTEM.OBJ).Load("/opt/irisapp/DemoSetup.Utilities.cls","ck") \
set helper=##class(DemoSetup.Utilities).%New() \
do helper.EnableSSLSuperServer() \
do ##class(Security.Applications).Import("/ApplicationInquisidor.xml",.n) \
zn "INQUISIDOR" \
set sc = $SYSTEM.OBJ.LoadDir("/opt/irisapp/src/Inquisidor", "ck", , 1) \
set production = "Inquisidor.Production" \
set ^Ens.Configuration("csp","LastProduction") = production \
do ##class(Ens.Director).SetAutoStart(production) \
La compilación del código me estaba retornando el error previo. ¿Qué debía hacer entonces para solucionarlo? Pues una cosa muy sencilla, debía enviarle a la imagen inicial de IRIS la nueva licencia y pedirle en la primera línea de los comandos que estaba usando que actualizase la licencia.
El primer paso es pasarle a la imagen la nueva licencia al directorio /mgr de la instalación, cosa que hice con este código:
COPY --chown=$ISC_PACKAGE_MGRUSER:$ISC_PACKAGE_IRISGROUP /iris/iris.key /usr/irissys/mgr
RUN chmod +x /usr/irissys/mgr/iris.key
La ruta de la instalación de IRIS en su imagen es /usr/irissys/mgr, la ruta /iris/iris.key es mi directorio local. Con la licencia en la imagen de IRIS sólo necesitaba indicarle a IRIS que actualice su licencia, por lo que modifiqué los comandos anteriores añadiendo la siguiente instrucción:
RUN \
zn "%SYS" \
do ##class(%SYSTEM.License).Upgrade() \
Et voila! Ya tengo mi imagen de IRIS con mi licencia cargada antes de importar y compilar mis clases, se acabó el error de compilación.
Espero que os sea de utilidad.