我想用 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
为什么文件大小如此之大?
该文件大小是否正常?
答案 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
。
答案 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镜像相比,体积比较小。