web-dev-qa-db-fra.com

Comment réduire une taille d'image python (docker) en utilisant une construction en plusieurs étapes?

Je cherche un moyen de créer des builds à plusieurs étages avec python et Dockerfile:

Par exemple, en utilisant les images suivantes:

1ère image: installez toutes les exigences de temps de compilation, et installez tous les modules nécessaires python

2ème image: copiez tous les paquets compilés/construits de la première image à la seconde, sans les compilateurs eux-mêmes (gcc, postgers-dev, python-dev etc.)

L'objectif final est d'avoir une image plus petite, exécutant python et les packages python dont j'ai besoin).

En bref: comment puis-je "envelopper" tous les modules compilés (site-packages/libs externes) qui ont été créés dans la première image, et les copier de manière "propre", à la 2ème image.

13
gCoh

ok donc ma solution utilise wheel, elle nous permet de compiler sur la première image, de créer des fichiers wheel pour toutes les dépendances et de les installer dans la deuxième image, sans installer les compilateurs

FROM python:2.7-Alpine as base

RUN mkdir /svc
COPY . /svc
WORKDIR /svc

RUN apk add --update \
    postgresql-dev \
    gcc \
    musl-dev \
    linux-headers

RUN pip install wheel && pip wheel . --wheel-dir=/svc/wheels

FROM python:2.7-Alpine

COPY --from=base /svc /svc

WORKDIR /svc

RUN pip install --no-index --find-links=/svc/wheels -r requirements.txt

Vous pouvez voir ma réponse à ce sujet dans le blog suivant

https://galnevis.wixsite.com/website/single-post/2018/02/10/Python-and-Docker-multistage-build

11
gCoh