Article
· Sept 8, 2023 6m de lecture

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/
Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer