为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕妹3242003 2022-06-28 17:29:13
我想用这个 dockerize python 程序Dockerfile:FROM python:3.7-alpineCOPY requirements.pip ./requirements.pipRUN python3 -m pip install --upgrade pipRUN pip install -U setuptoolsRUN apk updateRUN 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-depsARG APP_DIR=/appRUN mkdir -p ${APP_DIR} WORKDIR ${APP_DIR} COPY app . ENTRYPOINT [ "python3", "run.py" ]这是我的requirements.pip文件:pysher~=0.5.0redis~=2.10.6flake8~=3.5.0pandas==0.23.4因为pandas,docker镜像有461MB,没有pandas 131MB。我在想如何让它更小,所以我从我的应用程序中构建二进制文件:pyinstaller run.py --onefile它构建了 38M 的二进制文件。当我运行它时,它工作正常。所以我从以下位置构建 docker 映像Dockerfile:FROM alpine:3.4ARG APP_DIR=/appRUN mkdir -p ${APP_DIR}WORKDIR ${APP_DIR}COPY app/dist/run runENTRYPOINT [ "/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 updateRUN apk upgradeRUN apk add bash图像已构建,但当我运行它时再次出现错误:$ $ docker run --rm --name myapp myminimalimage:latest/app/run: /app/run: cannot execute binary file我的问题:为什么第一步的图像这么大?我可以以某种方式最小化尺寸吗?喜欢从 pandas 包中选择要安装的内容?为什么我的二进制文件在我的系统(Kubuntu 18.10)上运行良好但我无法从中运行它alpine:3.4,我应该使用另一个图像还是安装一些东西来运行它?使用我的应用程序构建简约图像的最佳方法是什么?上面提到的一种还是有其他方法?
查看完整描述

2 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

关于尺寸,请确保您在使用时始终通过(您使用一次,但在其他情况下不使用)。同样,结合使用并确保最后一步是清除缓存,使其永远不会在图像层中冻结,例如将三个单独的 s替换为; 在单层中实现相同的效果,即不保留缓存。--no-cache-dirpipapkapkRUNRUN apk update && apk upgrade && apk add bash && rm -rf /var/cache/apk/*apk


例子:


FROM python:3.7-alpine


COPY requirements.pip ./requirements.pip


# Avoid pip cache, use consistent command line with other uses, and merge simple layers

RUN 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 end

RUN 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是一个巨大的单体包,依赖于其他巨大的单体包;您可以在这里完成的工作是有限度的。


查看完整回答
反对 回复 2022-06-28
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

请记住,如果您不使用 Alpine,则不需要编译器,因为您可以只使用轮子。这使一切变得更简单......例如,您不需要安装然后卸载编译器。稍微大一点,但只有一点点。

(有关我为什么不喜欢 Alpine Linux 的更多信息,请参见此处:https ://pythonspeed.com/articles/base-image-python-docker-images/ )


查看完整回答
反对 回复 2022-06-28
  • 2 回答
  • 0 关注
  • 451 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号