关于 docker 打包 Python 环境的问题

2018-11-21 16:15:42 +08:00
 kentxxq

下面是我正在使用的 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,应该会更快一些
6568 次点击
所在节点    Python
18 条回复
shylockhg
2018-11-21 16:18:20 +08:00
--no-cache-dir
tomczhen
2018-11-21 16:20:10 +08:00
通常解决 glibc 的问题就可以用 alpine 当基础镜像,体积可以小很多,不过我选择 debian。

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

pipenv 文档里有关于 docker 容器化的实践简单说明。
twotiger
2018-11-21 16:30:56 +08:00
一样基于 python:3.6,装完环境有 950M.强行感觉良好.
kentxxq
2018-11-21 16:49:27 +08:00
@shylockhg 嗯,又可以小一丢丢


@tomczhen 对个人学习项目来说,有点大。。
我 gitlab 提交。触发阿里的镜像构建。然后触发拉取镜像,重新部署。
我是想快速集成部署的。 结果。。
shylockhg
2018-11-21 18:00:50 +08:00
还有个 docker-slim 据说很厉害,不过没用过
keysona
2018-11-21 18:09:09 +08:00
alpine + go

之前项目再用,打包后也就 60M...
x66
2018-11-21 18:13:19 +08:00
@a805429509 构建和部署不应该在同一个数据中心吗
beginor
2018-11-21 18:40:22 +08:00
有 C 扩展的最好不要 alpine,老老实实 Debian 或者 Ubuntu
Beebird
2018-11-21 18:50:32 +08:00
可以试试 slim 的
alpline 用的不是 glibc 标准库,pip install 需要不少额外依赖,而且很多是需要 compile 的,耽误时间。即使这次解决了,后续在 requirements 里面增加 module 也可能需要新问题。我领教过其中的痛苦。。。

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

再有一些使用 mirror 什么的看你已经用上啦。
kentxxq
2018-11-21 19:30:11 +08:00
@x66 阿里云的镜像构建没有香港节点。。。 最近的貌似是新加坡,还不如选国内。。



@Beebird 学到了。 最后折腾一晚上 alpine,然后安心用 debian 了。
sky101001
2018-11-21 19:38:14 +08:00
gevent 这种库在 docker 里最好不要用 pip 安装,推荐使用包管理工具直接安装。
实测在 alpine 里是可以成功 apk add py-gevent 的
说起来 alpine 是真的小,我以前做过一个 python+flask+gevent+mysqldb+gunicorn 的镜像,debian 要 500M+,alpine 只要 60M
guog
2018-11-21 20:02:07 +08:00
网络好的可以用 alpine,否则老老实实的 Debian 或者直接 Python 了,不然下载构建依赖够你喝一壶的了。
guog
2018-11-21 20:03:24 +08:00
@sky101001 alpine 自身才三点几兆吧,肯定小呀
vZexc0m
2018-11-22 09:57:59 +08:00
python 还是老老实实用 debian/ubuntu、centos 吧 python 官方镜像的话体积太大了
HFcbyqP0iVO5KM05
2018-11-22 10:19:27 +08:00
Dockerfile 是每句 command 一层镜像,所以你那个 COPY . /root/ 拷贝的文件会保留在每层镜像中,即使在后面的语句中把它删掉,体积也不会缩小。
你这几个 command 可以用 && 符号连成一个 command,最后记得删掉不要的文件
kentxxq
2018-11-22 17:02:11 +08:00
```python:3-alpine
RUN sed -i "s@http://dl-cdn.alpinelinux.org/@https://mirrors.huaweicloud.com/@g" /etc/apk/repositories \
&& apk update \
&& apk upgrade \
&& apk add --no-cache git build-base make linux-headers openssl-dev libffi-dev \
&& pip --no-cache-dir install pip -U \
&& pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ \
&& pip --no-cache-dir install requirementslib \
&& python tt.py > requirements.txt \
&& pip --no-cache-dir install -r requirements.txt \
&& rm -rf /var/cache/apk/*
```

```python:3-slim
FROM python:3-slim

COPY . /root/

WORKDIR /root


RUN pip install pip -U \
&& pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ \
&& pip --no-cache-dir install requirementslib \
&& python tt.py > requirements.txt \
&& pip --no-cache-dir install -r requirements.txt


CMD ["gunicorn","-c","gunicorn_config.py","run:app"]
```

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

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

安心写代码去了
kentxxq
2018-11-22 17:29:35 +08:00
不折腾了
Joe0920
2018-12-24 14:16:34 +08:00
已经上 docker 了,再用 pipenv 意义何在?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/510074

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX