在Docker中的大尺寸的python图像

时间:2015-06-25 21:11:20

标签: python docker

我想用 Docker 测试我的应用。所以,我在 Dockerfile

中有这个
FROM python:3-onbuild
CMD [ "python", "./test.py" ]

test.py:

print(123)

然后我跑:

docker build -t my_test_app .

所以,我有一个大的形象。 docker images返回:

REPOSITORY          TAG                 IMAGE ID        CREATED    VIRTUAL SIZE
python              3-onbuild           b258eb0a5195    8 days ago 757 MB

为什么文件大小如此之大?

该文件大小是否正常?

6 个答案:

答案 0 :(得分:3)

Alpine Linux 是一款非常精简的Docker版本。没有Python,它大概是5MB。使用Python,我得到60到120 MB之间的图像。以下Dockerfile生成110 MB的图像。

FROM alpine:3.4

RUN apk --update add \
      build-base python-dev \
      ca-certificates python \
      ttf-droid \
      py-pip \
      py-jinja2 \
      py-twisted \
      py-dateutil \
      py-tz \
      py-requests \
      py-pillow \
      py-rrd && \
    pip install --upgrade arrow \
                          pymongo \
                          websocket-client \
                          XlsxWriter && \
    apk del build-base python-dev && \
    rm -rf /var/cache/apk/* && \
    adduser -D -u 1001 noroot

USER noroot

CMD ["/bin/sh"]

此外,它很好用。

答案 1 :(得分:3)

您可以尝试使用python:{version} -alpine版本。它的很多更小:

>> docker image ls |grep python
python    3.6-alpine     89.4 MB
python    3.6            689 MB
python    3.5            689 MB
python    3.5.2          687 MB
python    3.4            833 MB
python    2.7            676 MB

在撰写本文时,它看起来像所有python版本上的官方图片supoprts -alpine

https://hub.docker.com/_/python/

答案 2 :(得分:2)

我刚刚在我的机器上检查了标准的ubuntu:可信赖的图像是188 MB,所有python的图像都是480MB。我经常看到800MB的图像,通常包含一些有意义的应用程序。

然而,这些图像是基于我们的私人图像,官方Docker库图像由于某种原因看起来要大得多。他们意识到这一事实,正在努力减少它。查看关于主题的讨论here

如果你需要一个更小的图像尝试这个'rouge8 / pythons'它大约小100MB。

rouge8/pythons latest … 680.3 MB

请记住,泊坞窗图像是按层次结构排列的。因此,如果为许多容器重用相同的底层基础映像,则每个容器添加的大小非常小。它只是基数加上你添加到特定容器中的任何东西之间的差异。

答案 3 :(得分:1)

他们为数据库客户端,图像文件操作和XML解析库等事物添加了各种系统包。这样,如果用户想要为psycopg2,MySQLdb,Pillow或lxml安装Python包,就不需要做额外的工作。添加这些额外的包虽然意味着图像会更胖,如果你不需要这些包,那将是浪费空间。

他们也不会尝试从Python安装中删除不需要的东西,例如所有标准库测试代码目录。甚至可以修剪.pyc文件以节省空间而不会产生任何实际影响,因为Web应用程序通常会在容器的生命周期内加载一次,因此.pyc文件对您没有多大帮助。

作为比较,看一下'pythonX.Y-slim'变体及其大小。虽然没有针对苗条图像的onbuild变体。

您还可以使用捆绑的Apache / mod_wsgi支持查看我自己的Docker镜像。这些被修剪并依赖于用户仅在需要时作为构建挂钩安装的附加包。对于那些,专门针对WSGI应用程序的Python 3.4 onbuild映像的大小是:

grahamdumpleton/mod-wsgi-docker python-3.4-onbuild ... 409.9 MB

给出的大小甚至包括Apache和mod_wsgi,为您提供适当的生产级WSGI服务器,具有处理静态文件内容的功能等等。

如果没有运行WSGI应用程序,请改为使用基本映像。

您可以在以下位置找到mod_wsgi docker图像:

有关如何将这些图像用于WSGI应用程序以及为Python和WSGI应用程序构建Docker镜像的各种博客文章可以从Docker hub上的图像描述中找到。另外请关注我的博客网站,因为随着时间的推移,我将发布更多关于Docker和Python的信息。

答案 4 :(得分:0)

是的,这是正常的尺寸。该图像包含操作系统映像和各种包,这就是大小的原因。

答案 5 :(得分:0)

是的。很正常。

我看到有一个提到高山的答案。 Alpine linux 非常小,人们在生产中建议使用 alpine 是很常见的。

然而,我最近阅读了这篇文章:https://pythonspeed.com/articles/base-image-python-docker-images/,该文章建议使用 slim 而不是 alpine

要使用 python slim,您只需将它放在您的 Dockerfile

之上
FROM python-3.8:slim

下图中我使用的是fastapi + sqlalchemy + pipenv,和你原来的Python镜像相比,体积比较小。

enter image description here