V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kentxxq
V2EX  ›  Python

关于 docker 打包 Python 环境的问题

  •  
  •   kentxxq · 2018-11-21 16:15:42 +08:00 · 6586 次点击
    这是一个创建于 2195 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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


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

    之前项目再用,打包后也就 60M...
    x66
        7
    x66  
       2018-11-21 18:13:19 +08:00 via iPhone
    @a805429509 构建和部署不应该在同一个数据中心吗
    beginor
        8
    beginor  
       2018-11-21 18:40:22 +08:00 via Android
    有 C 扩展的最好不要 alpine,老老实实 Debian 或者 Ubuntu
    Beebird
        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 什么的看你已经用上啦。
    kentxxq
        10
    kentxxq  
    OP
       2018-11-21 19:30:11 +08:00
    @x66 阿里云的镜像构建没有香港节点。。。 最近的貌似是新加坡,还不如选国内。。



    @Beebird 学到了。 最后折腾一晚上 alpine,然后安心用 debian 了。
    sky101001
        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
    guog
        12
    guog  
       2018-11-21 20:02:07 +08:00 via Android
    网络好的可以用 alpine,否则老老实实的 Debian 或者直接 Python 了,不然下载构建依赖够你喝一壶的了。
    guog
        13
    guog  
       2018-11-21 20:03:24 +08:00 via Android
    @sky101001 alpine 自身才三点几兆吧,肯定小呀
    vZexc0m
        14
    vZexc0m  
       2018-11-22 09:57:59 +08:00
    python 还是老老实实用 debian/ubuntu、centos 吧 python 官方镜像的话体积太大了
    HFcbyqP0iVO5KM05
        15
    HFcbyqP0iVO5KM05  
       2018-11-22 10:19:27 +08:00 via Android
    Dockerfile 是每句 command 一层镜像,所以你那个 COPY . /root/ 拷贝的文件会保留在每层镜像中,即使在后面的语句中把它删掉,体积也不会缩小。
    你这几个 command 可以用 && 符号连成一个 command,最后记得删掉不要的文件
    kentxxq
        16
    kentxxq  
    OP
       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
        17
    kentxxq  
    OP
       2018-11-22 17:29:35 +08:00
    不折腾了
    Joe0920
        18
    Joe0920  
       2018-12-24 14:16:34 +08:00
    已经上 docker 了,再用 pipenv 意义何在?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2918 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:22 · PVG 22:22 · LAX 06:22 · JFK 09:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.