2 votes

Un conteneur Docker contenant des modules Python devient trop gros

Je veux que mon conteneur Docker utilise tensorflow lite (tflite) dans un script en python. Mon Dockerfile ressemble à ceci :

FROM arm32v7/python:3.7-slim-buster
COPY model.tflite /
COPY docker_tflite.py /
COPY numpy-1.20.2-cp37-cp37m-linux_armv7l.whl /
RUN apt-get update \
    && apt-get -y install libatlas-base-dev
RUN pip install numpy-1.20.2-cp37-cp37m-linux_armv7l.whl \
    && pip install --no-build-isolation --extra-index-url https://google-coral.github.io/py-repo/ tflite_runtime

CMD ["python", "docker_tflite.py"]

Le conteneur Docker est trop gros pour mon microcontrôleur (197 Mo). Y a-t-il un moyen de le réduire ?


UPDATE :

Suite à la réponse d'Itamar, j'ai ajusté mon Dockerfile :

FROM arm32v7/python:3.7-slim-buster as dev
COPY model.tflite /
COPY docker_tflite.py /
COPY numpy-1.20.2-cp37-cp37m-linux_armv7l.whl /
RUN apt-get update \
    && apt-get -y install libatlas-base-dev
RUN pip install --user numpy-1.20.2-cp37-cp37m-linux_armv7l.whl \
    && pip install --user --no-build-isolation --extra-index-url https://google-coral.github.io/py-repo/ tflite_runtime

FROM arm32v7/python:3.7-slim-buster as runtime
COPY model.tflite /
COPY docker_tflite.py /
COPY --from=dev /root/.local /root/.local
RUN apt-get update \
    && apt-get -y install libatlas-base-dev

CMD ["python", "docker_tflite.py"]

Entre-temps, le conteneur Docker est à 179 Mo, ce qui est déjà un progrès, merci beaucoup. Y a-t-il encore un potentiel d'optimisation dans mon Dockerfile, par exemple dans les déclarations apt-get ?

2voto

Vous vous retrouvez avec deux copies de numpy : la roue, et la version installée. La façon de résoudre ce problème est de construire en plusieurs étapes, où la deuxième étape n'a pas la roue, ou les en-têtes de développement, ou tout autre fichier de construction inutile.

FROM arm32v7/python:3.7-slim-buster as dev
# ...
RUN pip install --user numpy.whl && pip install --user --no-build-isolation ...

FROM arm32v7/python:3.7-slim-buster as runtime
COPY --from=dev /root/.local /root/.local

Quelque chose comme ça. Voir https://pythonspeed.com/articles/multi-stage-docker-python/

2voto

Ivonet Points 1332

Il existe plusieurs options pour réduire la taille de l'installation :

  • Vous pourriez faire une compilation avec par exemple PyInstaller et n'installer l'artefact que sur une image sans python. Vous obtenez le "binaire" et seulement les artefacts nécessaires pour exécuter l'application. Si vous le construisez sur une image de constructeur avec python et que vous copiez ensuite l'artefact sur votre image résultante, cela peut avoir un impact important sur la taille, en particulier si cette image est par exemple une image alpine bare ou busybox.
  • Vous pouvez également ajouter le --no-install-recommends à votre commande apt-get pour ne pas suivre tous les deps.
  • Image en plusieurs étapes avec une image de construction et une image cible. L'image du constructeur peut être aussi grande que nécessaire pour la construction et l'image de la cible aussi petite que possible et ne copier que ce qui est nécessaire pour la construction.
  • En 3.7-slim-stretch est déjà plus petit de quelques Mb que le slim-buster...
  • ajoutez ceci à votre commande RUN && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* pour nettoyer après vous
  • etc.

Je ne sais pas si l'impact sera suffisamment important pour être réduit à 120Mb. :-)

FROM arm32v7/python:3.7-slim-buster as dev
COPY model.tflite /
COPY docker_tflite.py /
COPY numpy-1.20.2-cp37-cp37m-linux_armv7l.whl /
RUN apt-get update \
    && apt-get -y install libatlas-base-dev
RUN pip install --user numpy-1.20.2-cp37-cp37m-linux_armv7l.whl \
    && pip install --user --no-build-isolation --extra-index-url https://google-coral.github.io/py-repo/ tflite_runtime

FROM arm32v7/python:3.7-slim-stretch as runtime
COPY model.tflite /
COPY docker_tflite.py /
COPY --from=dev /root/.local /root/.local
RUN apt-get update \
    && apt-get -y install libatlas-base-dev \
    && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

CMD ["python", "docker_tflite.py"]

^^^ changé en stretch et ajouté le truc apt-get clean

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X