Artículo
· 24 abr, 2023 Lectura de 5 min

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/
Comentarios (0)1
Inicie sesión o regístrese para continuar