关于Python项目在Docker中打包环境的问题

下面是我正在使用的 docker,但是打包后的镜像有 1g+

FROM python:3

COPY . /root/

WORKDIR /root

RUN pip install pip -U
&& pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
&& pip install pipenv
&& pipenv install

CMD [“pipenv”,“run”,“python”,“run.py”]

我很想使用 python:3-alpine 来构建,但是各种报错( slim 版本也会报错)。 安装部分包含有 c 代码的拓展包会出现问题。 安装 cffi,gevent 等有如下报错信息:

 CFFI but generic to the setup.py of any Python package that', ' tries to compile C code

问题如下:

  1. 有没有能解决上面问题的 docker 镜像推荐,如果包含有 pipenv 就更好了?我对 alpine 的包也不熟。
  2. 既然已经容器化了,我在容器中是不是把 pipfile 转成 requirements.txt 来安装会更好?不用 lock,应该会更快一些

关于Python项目在Docker中打包环境的问题

18 回复

–no-cache-dir


我无法理解你的问题

通常解决 glibc 的问题就可以用 alpine 当基础镜像,体积可以小很多,不过我选择 debian。

分层规划好,体积问题不算大问题。

pipenv 文档里有关于 docker 容器化的实践简单说明。

一样基于 python:3.6,装完环境有 950M.强行感觉良好.

嗯,又可以小一丢丢


对个人学习项目来说,有点大。。
我 gitlab 提交。触发阿里的镜像构建。然后触发拉取镜像,重新部署。
我是想快速集成部署的。 结果。。

还有个 docker-slim 据说很厉害,不过没用过

alpine + go

之前项目再用,打包后也就 60M…

有 C 扩展的最好不要 alpine,老老实实 Debian 或者 Ubuntu

可以试试 slim 的
alpline 用的不是 glibc 标准库,pip install 需要不少额外依赖,而且很多是需要 compile 的,耽误时间。即使这次解决了,后续在 requirements 里面增加 module 也可能需要新问题。我领教过其中的痛苦。。。

还有,如果希望快速 build image 的话,建议先单独 COPY requirement.txt, RUN pip install, 最后再 COPY 代码。 因为 requirements.txt 相对修改比较少,可以节约生成 pip install 这一个 layer 的时间(不确定阿里云的镜像构建是否强制每次都重基础镜像重新 build)。

再有一些使用 mirror 什么的看你已经用上啦。

阿里云的镜像构建没有香港节点。。。 最近的貌似是新加坡,还不如选国内。。



学到了。 最后折腾一晚上 alpine,然后安心用 debian 了。

gevent 这种库在 docker 里最好不要用 pip 安装,推荐使用包管理工具直接安装。
实测在 alpine 里是可以成功 apk add py-gevent 的
说起来 alpine 是真的小,我以前做过一个 python+flask+gevent+mysqldb+gunicorn 的镜像,debian 要 500M+,alpine 只要 60M

网络好的可以用 alpine,否则老老实实的 Debian 或者直接 Python 了,不然下载构建依赖够你喝一壶的了。

alpine 自身才三点几兆吧,肯定小呀

python 还是老老实实用 debian/ubuntu、centos 吧 python 官方镜像的话体积太大了

Dockerfile 是每句 command 一层镜像,所以你那个 COPY . /root/ 拷贝的文件会保留在每层镜像中,即使在后面的语句中把它删掉,体积也不会缩小。
你这几个 command 可以用 && 符号连成一个 command,最后记得删掉不要的文件

python:3-alpine<br>RUN sed -i "s@http://<a target="_blank" href="http://dl-cdn.alpinelinux.org/@https://mirrors.huaweicloud.com/@g" rel="nofollow noopener">dl-cdn.alpinelinux.org/@https://mirrors.huaweicloud.com/@g</a>" /etc/apk/repositories \<br> &amp;&amp; apk update \<br> &amp;&amp; apk upgrade \<br> &amp;&amp; apk add --no-cache git build-base make linux-headers openssl-dev libffi-dev \<br> &amp;&amp; pip --no-cache-dir install pip -U \<br> &amp;&amp; pip config set global.index-url <a target="_blank" href="https://mirrors.aliyun.com/pypi/simple/" rel="nofollow noopener">https://mirrors.aliyun.com/pypi/simple/</a> \<br> &amp;&amp; pip --no-cache-dir install requirementslib \<br> &amp;&amp; python <a target="_blank" href="http://tt.py" rel="nofollow noopener">tt.py</a> &gt; requirements.txt \<br> &amp;&amp; pip --no-cache-dir install -r requirements.txt \<br> &amp;&amp; rm -rf /var/cache/apk/*<br>

python:3-slim<br>FROM python:3-slim<br><br>COPY . /root/<br><br>WORKDIR /root<br><br><br>RUN pip install pip -U \<br> &amp;&amp; pip config set global.index-url <a target="_blank" href="https://mirrors.aliyun.com/pypi/simple/" rel="nofollow noopener">https://mirrors.aliyun.com/pypi/simple/</a> \<br> &amp;&amp; pip --no-cache-dir install requirementslib \<br> &amp;&amp; python <a target="_blank" href="http://tt.py" rel="nofollow noopener">tt.py</a> &gt; requirements.txt \<br> &amp;&amp; pip --no-cache-dir install -r requirements.txt <br><br><br>CMD ["gunicorn","-c","<a target="_blank" href="http://gunicorn_config.py" rel="nofollow noopener">gunicorn_config.py</a>","run:app"]<br>

最终通过这几个包,满足了我现在的需要。但是:
<br>myapp alpine bc665f800e59 20 seconds ago 318MB<br>myapp slim e675bfd36544 5 minutes ago 202MB<br>

1.体积反而更大了…(不想再花更多时间在这上面)。我其实只看重这点才用 alpine
2.我还应该把 RUN 里面 apk 语句放到一个新的层来做缓存,加速构建
3.pipenv 在 alpine 下问题也比 slim 版本多…

安心写代码去了

不折腾了

已经上 docker 了,再用 pipenv 意义何在?

回到顶部