Mantén tus imágenes de IRIS en docker a punto ;-)
iris-docker-multi-stage-script
Os presentamos un script en Python para mantener a punto tus imágenes de IRIS en Docker ;-)

Sin necesidad de cambiar tu dockerfile o tu código, puedes reducir el tamaño de tu imagen en un 50% o más!
TL;DR
Nombra a tu imagen builder como builder y a la imagen final final y añade esto al final de tu Dockerfile:
Modifica tu Dockerfile para usar un build multi-stage:
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE as builder
Añade esto al final de tu Dockerfile:
FROM $IMAGE as final
ADD --chown=${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} https://github.com/grongierisc/iris-docker-multi-stage-script/releases/latest/download/copy-data.py /irisdev/app/copy-data.py
RUN --mount=type=bind,source=/,target=/builder/root,from=builder \
cp -f /builder/root/usr/irissys/iris.cpf /usr/irissys/iris.cpf && \
python3 /irisdev/app/copy-data.py -c /usr/irissys/iris.cpf -d /builder/root/
¡Boom! ¡Ya está listo!
Uso
usage: copy-data.py [-h] -c CPF -d DATA_DIR [--csp] [-p] [-o OTHER [OTHER ...]]
Copy data from a directory to the IRIS data directory
optional arguments:
-h, --help show this help message and exit
-c CPF, --cpf CPF path to the iris.cpf file
-d DATA_DIR, --data_dir DATA_DIR
path to the directory where the data files are located
--csp toggle the copy of the whole CSP folder
-p, --python toggle the copy of python libs
-o OTHER [OTHER ...], --other OTHER [OTHER ...]
toggle the copy of other folders
Cómo usarlo
Primero, echa un vistazo al archivo de configuración Dockerfile en modo non-multi-stage para Iris:
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE
WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}
# copy source code
COPY src src
COPY misc misc
COPY data/fhir fhirdata
COPY iris.script /tmp/iris.script
COPY fhirUI /usr/irissys/csp/user/fhirUI
# run iris and initial
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.script \
&& iris stop IRIS quietly
Es un Dockerfile simple, que generará una imagen con el código fuente de Iris y los datos en el modelo FHIR. También ejecutará el iris.script para crear la base de datos fhir y cargar los datos.
Con este tipo de Dockerfile obtendremos una imagen bastante voluminosa. Esto no es un problema si estás usando un pipeline CI/CD para generar tus imágenes. Si estás usando esta imagen en producción, terminarás con una imagen demasiado grande que ocupará mucho espacio en tu servidor.
Echemos un vistazo a un Dockerfile configurado en modo multi-stage para Iris
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE as builder
WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}
# copy source code
COPY src src
COPY misc misc
COPY data/fhir fhirdata
COPY iris.script /tmp/iris.script
COPY fhirUI /usr/irissys/csp/user/fhirUI
# run iris and initial
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.script \
&& iris stop IRIS quietly
# copy data from builder
FROM $IMAGE as final
ADD --chown=${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} https://github.com/grongierisc/iris-docker-multi-stage-script/releases/latest/download/copy-data.py /irisdev/app/copy-data.py
RUN --mount=type=bind,source=/,target=/builder/root,from=builder \
cp -f /builder/root/usr/irissys/iris.cpf /usr/irissys/iris.cpf && \
python3 /irisdev/app/copy-data.py -c /usr/irissys/iris.cpf -d /builder/root/
Es un Dockerfile configurado en multi-stage que generará una imagen con el código fuente de Iris y los datos en modelo FHIR. También ejecutará el iris.script para crear la base de datos fhir y cargar los datos. También copiará los datos desde la imagen del builder a la imagen final, reduciendo así su tamaño final.
Veamos más en detalle el Dockerfile configurado en modo multi-stage:
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE as builder
Define la imagen base y el nombre de la imagen builder
WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}
# copy source code
COPY src src
COPY misc misc
COPY data/fhir fhirdata
COPY iris.script /tmp/iris.script
COPY fhirUI /usr/irissys/csp/user/fhirUI
# run iris and initial
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.script \
&& iris stop IRIS quietly
Básicamente lo mismo que el Dockerfile configurado en modonon-multi-stage
FROM $IMAGE as final
Empezamos con la imagen base
ADD --chown=${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} https://github.com/grongierisc/iris-docker-multi-stage-script/releases/latest/download/copy-data.py /irisdev/app/copy-data.py
Añadismo el script copy-data.py a la imagen con el usuario y grupo correcto
RUN --mount=type=bind,source=/,target=/builder/root,from=builder \
cp -f /builder/root/usr/irissys/iris.cpf /usr/irissys/iris.cpf && \
python3 /irisdev/app/copy-data.py -c /usr/irissys/iris.cpf -d /builder/root/
Aquí vemos que están sucendiendo varias cosas.
Primero, estamos usando la opción --mount para montar la imagen builder.
- --mount=type=bind es el tipo de montaje
- source=/ es la raíz de la imagen builder
- target=/builder/root es la raíz de la imagen builder que se montara al final
- from=builder es el nombre de la imagen builder
A continuación copiamos el fichero iris.cpf desde la image builder a la imagen final.
cp -f /builder/root/usr/irissys/iris.cpf /usr/irissys/iris.cpf
Y finalmente ejecutamos el script copy-data.py para copiar los datos desde la imagen builder a la imagen final.
python3 /irisdev/app/copy-data.py -c /usr/irissys/iris.cpf -d /builder/root/
Comparando ambos
Non multi-stage Dockerfile
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE
WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}
COPY . .
RUN iris start IRIS
&& iris session IRIS < /tmp/iris.script
&& iris stop IRIS quietly
Multi-stage Dockerfile
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE as builder
WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}
COPY . .
RUN iris start IRIS
&& iris session IRIS < /tmp/iris.script
&& iris stop IRIS quietly
FROM $IMAGE as final
ADD --chown=${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} https://github.com/grongierisc/iris-docker-multi-stage-script/releases/latest/download/copy-data.py /irisdev/app/copy-data.py
RUN --mount=type=bind,source=/,target=/builder/root,from=builder
cp -f /builder/root/usr/irissys/iris.cpf /usr/irissys/iris.cpf &&
python3 /irisdev/app/copy-data.py -c /usr/irissys/iris.cpf -d /builder/root/