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 东西
我希望我的 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 东西