下面是我正在使用的 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
shylockhg 2018-11-21 16:18:20 +08:00
--no-cache-dir
|
2
tomczhen 2018-11-21 16:20:10 +08:00 via Android
通常解决 glibc 的问题就可以用 alpine 当基础镜像,体积可以小很多,不过我选择 debian。
分层规划好,体积问题不算大问题。 pipenv 文档里有关于 docker 容器化的实践简单说明。 |
3
twotiger 2018-11-21 16:30:56 +08:00
一样基于 python:3.6,装完环境有 950M.强行感觉良好.
|
4
kentxxq OP |
5
shylockhg 2018-11-21 18:00:50 +08:00
还有个 docker-slim 据说很厉害,不过没用过
|
6
keysona 2018-11-21 18:09:09 +08:00
alpine + go
之前项目再用,打包后也就 60M... |
7
x66 2018-11-21 18:13:19 +08:00 via iPhone
@a805429509 构建和部署不应该在同一个数据中心吗
|
8
beginor 2018-11-21 18:40:22 +08:00 via Android
有 C 扩展的最好不要 alpine,老老实实 Debian 或者 Ubuntu
|
9
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 什么的看你已经用上啦。 |
10
kentxxq OP |
11
sky101001 2018-11-21 19:38:14 +08:00 via iPad
gevent 这种库在 docker 里最好不要用 pip 安装,推荐使用包管理工具直接安装。
实测在 alpine 里是可以成功 apk add py-gevent 的 说起来 alpine 是真的小,我以前做过一个 python+flask+gevent+mysqldb+gunicorn 的镜像,debian 要 500M+,alpine 只要 60M |
12
guog 2018-11-21 20:02:07 +08:00 via Android
网络好的可以用 alpine,否则老老实实的 Debian 或者直接 Python 了,不然下载构建依赖够你喝一壶的了。
|
14
vZexc0m 2018-11-22 09:57:59 +08:00
python 还是老老实实用 debian/ubuntu、centos 吧 python 官方镜像的话体积太大了
|
15
HFcbyqP0iVO5KM05 2018-11-22 10:19:27 +08:00 via Android
Dockerfile 是每句 command 一层镜像,所以你那个 COPY . /root/ 拷贝的文件会保留在每层镜像中,即使在后面的语句中把它删掉,体积也不会缩小。
你这几个 command 可以用 && 符号连成一个 command,最后记得删掉不要的文件 |
16
kentxxq OP ```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 版本多..... 安心写代码去了 |
17
kentxxq OP 不折腾了
|
18
Joe0920 2018-12-24 14:16:34 +08:00
已经上 docker 了,再用 pipenv 意义何在?
|