如何最小化python3.7应用程序docker镜像

我想用这个 dockerize python 程序Dockerfile:


FROM python:3.7-alpine


COPY requirements.pip ./requirements.pip


RUN python3 -m pip install --upgrade pip


RUN pip install -U setuptools


RUN apk update


RUN apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev openssl-dev libffi-dev g++ && \

    python3 -m pip install -r requirements.pip --no-cache-dir && \

    apk --purge del .build-deps


ARG APP_DIR=/app


RUN mkdir -p ${APP_DIR} 


WORKDIR ${APP_DIR} 


COPY app . 


ENTRYPOINT [ "python3", "run.py" ]

这是我的requirements.pip文件:


pysher~=0.5.0


redis~=2.10.6


flake8~=3.5.0


pandas==0.23.4

因为pandas,docker镜像有461MB,没有pandas 131MB。


我在想如何让它更小,所以我从我的应用程序中构建二进制文件:


pyinstaller run.py --onefile

它构建了 38M 的二进制文件。当我运行它时,它工作正常。所以我从以下位置构建 docker 映像Dockerfile:


FROM alpine:3.4


ARG APP_DIR=/app

RUN mkdir -p ${APP_DIR}

WORKDIR ${APP_DIR}


COPY app/dist/run run


ENTRYPOINT [ "/bin/sh", "/app/run" ]

基本上,只是将我的run二进制文件复制到/app目录中。看起来不错,图像只有 48.8MB。当我运行容器时,我收到错误:


$ docker run --rm --name myapp myminimalimage:latest

/app/run: line 1: syntax error: unexpected "("

然后我在想,也许有问题sh,所以我安装了bash,所以我在其中添加了 3 行Dockerfile:


RUN apk update


RUN apk upgrade


RUN apk add bash

图像已构建,但当我运行它时再次出现错误:


$ $ docker run --rm --name myapp myminimalimage:latest

/app/run: /app/run: cannot execute binary file

我的问题:

  1. 为什么第一步的图像这么大?我可以以某种方式最小化尺寸吗?喜欢从 pandas 包中选择要安装的内容?

  2. 为什么我的二进制文件在我的系统(Kubuntu 18.10)上运行良好但我无法从中运行它alpine:3.4,我应该使用另一个图像还是安装一些东西来运行它?

  3. 使用我的应用程序构建简约图像的最佳方法是什么?上面提到的一种还是有其他方法?


慕妹3242003
浏览 452回答 2
2回答

四季花海

关于尺寸,请确保您在使用时始终通过(您使用一次,但在其他情况下不使用)。同样,结合使用并确保最后一步是清除缓存,使其永远不会在图像层中冻结,例如将三个单独的 s替换为; 在单层中实现相同的效果,即不保留缓存。--no-cache-dirpipapkapkRUNRUN apk update && apk upgrade && apk add bash && rm -rf /var/cache/apk/*apk例子:FROM python:3.7-alpineCOPY requirements.pip ./requirements.pip# Avoid pip cache, use consistent command line with other uses, and merge simple layersRUN python3 -m pip install --upgrade --no-cache-dir pip && \    python3 -m pip install --upgrade --no-cache-dir setuptools# Combine update and add into same layer, clear cache explicitly at endRUN apk update && apk add --no-cache --virtual .build-deps gcc python3-dev musl-dev openssl-dev libffi-dev g++ && \    python3 -m pip install -r requirements.pip --no-cache-dir && \    apk --purge del .build-deps && rm -rf /var/cache/apk/*不要指望它会做很多事情(您已经--no-cache-dir在大型pip操作中使用过),但它确实有用。pandas是一个巨大的单体包,依赖于其他巨大的单体包;您可以在这里完成的工作是有限度的。

芜湖不芜

请记住,如果您不使用 Alpine,则不需要编译器,因为您可以只使用轮子。这使一切变得更简单......例如,您不需要安装然后卸载编译器。稍微大一点,但只有一点点。(有关我为什么不喜欢 Alpine Linux 的更多信息,请参见此处:https ://pythonspeed.com/articles/base-image-python-docker-images/ )
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python