Gardez vos images iris docker en forme ;)
iris-docker-multi-stage-script
Un script python pour garder vos images docker iris en forme ;)

Sans changer votre dockerfile ou votre code vous pouvez réduire la taille de votre image de 50% ou plus !
TL;DR
Nommez l'image de constructeur builder et l'image finale final et ajoutez ceci à la fin de votre fichier Dockerfile :
Modifiez votre fichier Dockerfile pour utiliser une construction multi-étapes :
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE as builder
Ajoutez ceci à la fin de votre fichier 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/
Boum ! Vous avez terminé !
Usage
usage: copy-data.py [-h] -c CPF -d DATA_DIR [--csp] [-p] [-o OTHER [OTHER ...]]
Recopiez les données d'un répertoire dans le répertoire de données d'IRIS
arguments facultatifs :
-h, --help affichage de ce message d'aide et sortie
-c CPF, --cpf CPF chemin d'accès au fichier iris.cpf
-d DATA_DIR, --data_dir DATA_DIR
chemin d'accès au répertoire où les fichiers de données sont placés
--csp activation de la copie de l'ensemble du dossier CSP
-p, --python activation de la copie des librairies python
-o OTHER [OTHER ...], --autre: OTHER [OTHER ...]
activation de la copie d'autres dossiers
Comment l'utiliser
Nous allons d'abord jeter un coup d'œil à un fichier Dockerfile pour iris qui ne comporte pas de multi-étapes :
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}
# copie du code source
COPY src src
COPY misc misc
COPY data/fhir fhirdata
COPY iris.script /tmp/iris.script
COPY fhirUI /usr/irissys/csp/user/fhirUI
# exécution d'iris et de l'initial
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.script \
&& iris stop IRIS quietly
Il s'agit d'un simple fichier Dockerfile qui construira une image avec le code source d'iris et les données fhir. Il exécutera également le script iris.script pour créer la base de données fhir et charger les données.
Avec ce type de fichier dockerfile, vous obtiendrez une image volumineuse. Ce n'est pas un problème si vous utilisez un pipeline CI/CD pour construire vos images. Mais si vous utilisez cette image en production, vous obtiendrez une image volumineuse qui prendra beaucoup de place sur votre serveur.
Voici ensuite un fichier Dockerfile multi-étapes pour 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}
# copie du code source
COPY src src
COPY misc misc
COPY data/fhir fhirdata
COPY iris.script /tmp/iris.script
COPY fhirUI /usr/irissys/csp/user/fhirUI
# exécution de l'iris et de l'initial
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.script \
&& iris stop IRIS quietly
# copie des données du constructeur
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/
Il s'agit d'un fichier Dockerfile multi-étapes qui va construire une image avec le code source d'iris et les données fhir. Il exécutera également le script iris.script pour créer la base de données fhir et charger les données. Mais il copiera également les données de l'image de constructeur vers l'image finale. Cela réduira la taille de l'image finale.
Lisons maintenant en détail le fichier Dockerfile multi-étapes :
ARG IMAGE=intersystemsdc/irishealth-community:latest
FROM $IMAGE as builder
Définissez l'image de base et le nom de l'image du constructeur.
WORKDIR /irisdev/app
RUN chown ${ISC_PACKAGE_MGRUSER}:${ISC_PACKAGE_IRISGROUP} /irisdev/app
USER ${ISC_PACKAGE_MGRUSER}
# copie du code source
COPY src src
COPY misc misc
COPY data/fhir fhirdata
COPY iris.script /tmp/iris.script
COPY fhirUI /usr/irissys/csp/user/fhirUI
# exécution de l'iris et de l'initial
RUN iris start IRIS \
&& iris session IRIS < /tmp/iris.script \
&& iris stop IRIS quietly
En principe, c'est la même chose que pour le fichier Dockerfile qui ne comporte pas de multi-étapes.
FROM $IMAGE as final
Commencez par l'image de 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
Ajoutez le script copy-data.py à l'image avec un utilisateur et un groupe adéquats.
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/
Beaucoup de choses se produisent ici.
Nous commençons par utiliser l'option --mount pour monter l'image du constructeur.
- --mount=type=bind est le type de montage
- source=/ est la racine de l'image du constructeur
- target=/builder/root est la racine de l'image du constructeur montée en final
- from=builder est le nom de l'image du constructeur
Nous copions ensuite le fichier iris.cpf de l'image du constructeur vers l'image finale.
cp -f /builder/root/usr/irissys/iris.cpf /usr/irissys/iris.cpf
Enfin, nous exécutons le script copy-data.py pour copier les données de l'image du constructeur vers l'image finale.
python3 /irisdev/app/copy-data.py -c /usr/irissys/iris.cpf -d /builder/root/
Comparaison côte à côte
Le fichier Dockerfile qui ne comporte pas de multi-étapes
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
Le fichier Dockerfile multi-étapes
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/