带有Python模块的Docker容器太大了



我希望我的Docker容器在python脚本中使用tensorflow lite(tflite(。我的Dockerfile是这样的:

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"]

Docker Container对于我197 MB的微控制器来说太大了,有什么办法让它更小吗?


更新:

根据Itamar的回答,我调整了我的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"]

同时Docker容器的容量为179MB,这已经是一个进步了,非常感谢。在我的Dockerfile中,例如在apt-get语句中,还有更多的优化潜力吗?

有很多选项可以缩小安装:

  • 您可以使用例如PyInstaller进行构建,并且只在没有python的映像上安装工件。你得到了";二进制";并且只有运行应用程序所需的工件。如果你用python在构建器图像上构建它,然后将工件复制到你的生成图像中,它可能会对大小产生很大影响,尤其是当图像是高山裸图像或busybox图像时
  • 您还可以将--no-install-recommends添加到apt-get命令中,使其不遵循所有dep
  • 具有一个构建器图像和一个目标图像的多阶段图像。构建器映像可以是构建所需的大小,目标映像可以是尽可能小的,并且只复制所需的最终构建
  • 3.7-slim-stretch已经比纤薄的buster小了几个Mb
  • 将此添加到您的RUN命令&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*中,以便自己清理
  • 等等

我不知道影响是否会大到足以降低到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"]

^^^改为拉伸,并添加了易于清洁的

您最终会得到numpy的两个副本:轮子和已安装的版本。解决这个问题的方法是使用多阶段构建,其中第二阶段没有轮子、开发头或任何其他不必要的构建文件。

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

类似的东西。看见https://pythonspeed.com/articles/multi-stage-docker-python/

最新更新