Docker 包含 Python 个模块的容器变得太大

Docker container with Python modules gets too big

我希望我的 Docker 容器在 python 脚本中使用 tensorflow lite (tflite)。我的 Docker 文件如下所示:

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 容器对于我的 197 MB 微控制器来说太大了,有什么办法可以让它变小吗?


更新:

根据 Itamar 的回答,我调整了我的 Docker 文件:

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 容器为 179 MB,这已经是一个进步,非常感谢。我的 Docker 文件中是否还有更多优化潜力,例如在 apt-get 语句中?

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

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/

有很多选项可以使安装更小:

  • 您可以使用例如PyInstaller 并且只在没有 python 的图像上安装工件。您获得了“二进制文件”,并且只有 运行 应用程序所需的工件。如果您使用 python 在构建器映像上构建它,然后将工件复制到生成的映像中,它可能会对大小产生很大影响,尤其是该映像的大小,例如alpine bare 或 busybox 图像。
  • 您还可以将 --no-install-recommends 添加到您的 apt-get 命令中以不关注所有部门。
  • 包含一个构建器图像和一个目标图像的多阶段图像。构建器镜像可以和构建所需的一样大,目标镜像尽可能小,并且只复制需要的最终构建。
  • 3.7-slim-stretch 已经比 slim-buster 小了好几 Mb...
  • 将此添加到您的 运行 命令中 && 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"]

^^^ 更改为 stretch 并添加了 apt-get clean 东西