首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自python的Docker Image > 1GB :3.8.3-高寒

来自python的Docker Image > 1GB :3.8.3-高寒
EN

Stack Overflow用户
提问于 2021-08-05 00:07:52
回答 2查看 5.1K关注 0票数 7

虽然我读过很多文章、教程和YouTube视频,但我仍然发现,当Python的高寒图像只有25 MB时,我的图像大小超过了1GB(如果我读得对!)。

我正在努力弄清楚如何使它变小(如果实际上需要的话)。

注意:我一直在遵循教程来创建下面的内容。大部分都有道理..。但有些感觉像是伏都教

这里是我的Dockerfile:

代码语言:javascript
复制
FROM python:3.8.3-alpine

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN mkdir -p /home/app

RUN addgroup -S app && adduser -S app -G app

ENV HOME=/home/app
ENV APP_HOME=/home/app/web
RUN mkdir $APP_HOME
RUN mkdir $APP_HOME/staticfiles
RUN mkdir $APP_HOME/mediafiles
WORKDIR $APP_HOME

RUN pip install --upgrade pip

COPY requirements.txt .

RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && apk add jpeg-dev zlib-dev libjpeg \
    && apk add --update --no-cache postgresql-client

RUN pip install -r requirements.txt

RUN apk del build-deps

COPY entrypoint.prod.sh $APP_HOME

COPY . $APP_HOME

RUN chown -R app:app $APP_HOME

USER app

ENTRYPOINT ["/home/app/web/entrypoint.prod.sh"]

使用Pillowpsycopg2-binary已经造成了混乱和伤害的世界。特别是在以下方面:

代码语言:javascript
复制
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && apk add jpeg-dev zlib-dev libjpeg \
    && apk add --update --no-cache postgresql-client

RUN pip install -r requirements.txt

RUN apk del build-deps

这最初是:

代码语言:javascript
复制
RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql \
    && apk add postgresql-dev \
    && apk add --update --no-cache postgresql-client \
    && pip install psycopg2-binary \
    && apk add jpeg-dev zlib-dev libjpeg \
    && pip install Pillow \
    && apk del build-deps

我真的不知道有多少以上我需要让它运作。我认为可能有办法减少建造。

我知道有一种方法可以构建原始的图像,然后用它来转移东西,但是唯一的教程是令人困惑的,我很难在不增加更多复杂性的情况下解决这个问题。我真希望有个能亲自解释的人。

我也不知道图像的大小是否来自requirements.txt文件。我正在使用django,有一些要求:

requirements.txt

代码语言:javascript
复制
asgiref==3.4.1
Babel==2.9.1
boto3==1.18.12
botocore==1.21.12
certifi==2021.5.30
charset-normalizer==2.0.4
crispy-bootstrap5==0.4
defusedxml==0.7.1
diff-match-patch==20200713
Django==3.2.5
django-anymail==8.4
django-compat==1.0.15
django-crispy-forms==1.12.0
django-environ==0.4.5
django-extensions==3.1.3
django-hijack==2.3.0
django-hijack-admin==2.1.10
django-import-export==2.5.0
django-money==2.0.1
django-recaptcha==2.0.6
django-social-share==2.2.1
django-storages==1.11.1
et-xmlfile==1.1.0
fontawesomefree==5.15.3
gunicorn==20.1.0
idna==3.2
jmespath==0.10.0
MarkupPy==1.14
odfpy==1.4.1
openpyxl==3.0.7
Pillow==8.3.1
psycopg2-binary==2.9.1
py-moneyed==1.2
python-dateutil==2.8.2
pytz==2021.1
PyYAML==5.4.1
requests==2.26.0
s3transfer==0.5.0
six==1.16.0
sqlparse==0.4.1
stripe==2.60.0
tablib==3.0.0
urllib3==1.26.6
xlrd==2.0.1
xlwt==1.3.0

我的问题是,如何使图像变小。需要再小一点吗?

我只是想找到最好的方法将Django应用程序部署到Digitalocean,现在世界上有很多方法和教程等,我不知道它是否使使用对接程序变得更容易。我只是使用他们的应用程序平台吗?这能提供SSL吗?使用码头等有什么好处?

停靠-编写文件(供参考)

代码语言:javascript
复制
version: '3.7'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile.prod
    command: gunicorn maffsguru.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/home/app/web/staticfiles
      - media_volume:/home/app/web/mediafiles
    expose:
      - 8000
    env_file:
      - .env.docker
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    env_file:
      - .env.docker
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    ports:
      - 5432:5432
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/home/app/web/staticfiles
      - media_volume:/home/app/web/mediafiles
    ports:
      - 1337:80
    depends_on:
      - web

volumes:
  postgres_data:
  static_volume:
  media_volume:

只想说..。以上这些似乎都奏效了..。但是我不知道这个图像的大小会不会是个问题?

我也很困惑为什么Nginx似乎需要我去做http://0.0.0.0:1337来查看这个站点。不是通过导航到http://0.0.0.0/查看它的全部要点吗?

谢谢你的建议或指导,你可能会对我的问题的随机性表示歉意。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-05 01:18:45

欢迎来到码头!特别是刚开始的时候,这可能是一个人头脑清醒的原因,但你所问的问题都是很有意义的。

缩小尺寸

如何操作

一个很好的起点是Docker自己的Dockerfile最佳实践页面:

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

它们清楚地解释了您的每个directve (COPYRUNENV等)是如何创建额外层的,从而增加了容器的大小。重要的是,它们展示了如何通过最小化不同的指令来缩小图像大小。最小化的关键是使用RUN语句使用&&链接命令。

我在您的Dockerfile中注意到的还有一个特定的行:

代码语言:javascript
复制
COPY . $APP_HOME

现在,取决于您如何构建容器(具体来说,您将哪个文件夹作为上下文传递给Docker ),这将复制EVERYTHING,因为它对其可用。如果你有venv文件夹的话,这很可能会带来你的文件夹等等。我觉得这可能是你最大的行凶者。您可以通过在其中添加显式COPY或使用.dockerignore文件来缓解这一问题。

我构建了您的映像(没有任何源代码,也没有在entrypoint.sh中进行复制),它以710 as为基础。检查源代码的大小,看看是否还有其他的东西,这可能是个好主意。在我重新安排了一些命令以重用指令后,图像是484 to,这要小得多!如果你被卡住了,我可以帮你把它放到吉特布上的一个要点里,然后带你浏览一下,不过,Docker文档应该能让你继续前进。

为什么?

好吧,更大的应用程序/图像本身并不坏,但是随着数据的增加,一些操作可能会变慢。

当我说操作时,我的意思是从注册表中提取图像,或者推动它们发布。传输1GB比50 1GB花费更长的时间。

当你对容器进行缩放时,也要考虑一些因素。虽然映像大小不一定与启动容器时使用多少磁盘直接相关,但它肯定会增加对正在运行的机器的要求,并限制其他较小设备上的磁盘。

Docker

使用Docker的优点很普遍,我不可能在这里全部报道,而不提交论文答辩书;)

但它主要归结为以下几点:

支持在docker

  • Dockerfiles中运行应用程序的提供商的
  • Alot帮助您在一致的环境中构建应用程序,这意味着您不必配置应用程序运行的每个主机,或者担心clashes
  • Containers版本会让您在一致(和相同)的environment
  • Containers中开发和运行应用程序,通常会提供非常好的网络功能。您将遇到的一个示例是在docker组合中,您可以简单地通过它们的主机名

到达其他容器。

Nginx

你把事情安排得很好,据我所知!我想nginx是在“告诉你”(通过日志?)导航到0.0.0.0,因为它将绑定到容器中的。现在,您已经转发了来自1337:80的流量。Docker遵循host:container格式,因此这意味着localhost:1337上的通信将被定向到容器端口80。您可能需要根据您的nginx配置来交换它,但请放心,您将能够在浏览器中导航到本地主机,并在所有设置就绪后查看您的网站。

如果您需要帮助,或者需要更多的资源来帮助您,请告诉我。很高兴与您通信,并随时带您浏览,因为我们似乎在同一时区。

票数 10
EN

Stack Overflow用户

发布于 2021-08-05 12:47:07

注意,您必须安装一个编译器。那个编译器占用了很多空间。

大多数Python包都包含预编译的二进制包,那么为什么需要编译器呢?因为你在用阿尔卑斯山。来自PyPI的二进制包(PyPI)不能在高山上工作。

所以:

从阿尔卑斯基映像切换到例如python:3.8-slim-buster.

  • Get,去掉编译器安装和头等,您可能不需要其中的任何东西。

  • 喜欢您的新快速构建,很可能更小。

详细信息:https://pythonspeed.com/articles/alpine-docker-python/

另一种方法是多阶段构建,其中您的最终映像不包括不必要的编译器。当然,这增加了更多的复杂性。

(这是3篇文章系列)的起点:https://pythonspeed.com/articles/smaller-python-docker-images/

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68659216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档