密码学Python Docker多级构建

密码学Python Docker多级构建,python,docker,docker-multi-stage-build,Python,Docker,Docker Multi Stage Build,我有一个在docker容器中运行的Python项目,我正在尝试转换为多级docker构建过程。我的项目取决于软件包。我的Dockerfile包括: # Base FROM python:3.6 AS base RUN pip insta

我有一个在docker容器中运行的Python项目,我正在尝试转换为多级docker构建过程。我的项目取决于软件包。我的Dockerfile包括:

# Base                                                                          
FROM python:3.6 AS base                                                         

RUN pip install cryptography                                                    

# Production                                                                    
FROM python:3.6-alpine                                                          

COPY --from=base /root/.cache /root/.cache                                      

RUN pip install cryptography \                                                  
        && rm -rf /root/.cache                                                  

CMD python
我尝试用它来构建,例如:

docker build -t my-python-app .
这个过程适用于我测试过的许多其他Python需求,例如
pycrypto
psutil
,但是对于
cryptography
,会抛出以下错误:

Step 5/6 : RUN pip install cryptography         && rm -rf /root/.cache
 ---> Running in ebc15bd61d43
Collecting cryptography
  Downloading cryptography-2.1.4.tar.gz (441kB)
Collecting idna>=2.1 (from cryptography)
  Using cached idna-2.6-py2.py3-none-any.whl
Collecting asn1crypto>=0.21.0 (from cryptography)
  Using cached asn1crypto-0.24.0-py2.py3-none-any.whl
Collecting six>=1.4.1 (from cryptography)
  Using cached six-1.11.0-py2.py3-none-any.whl
Collecting cffi>=1.7 (from cryptography)
  Downloading cffi-1.11.5.tar.gz (438kB)
    Complete output from command python setup.py egg_info:

        No working compiler found, or bogus compiler options passed to
        the compiler from Python's standard "distutils" module.  See
        the error messages above.  Likely, the problem is not related
        to CFFI but generic to the setup.py of any Python package that
        tries to compile C code.  (Hints: on OS/X 10.8, for errors about
        -mno-fused-madd see http://stackoverflow.com/questions/22313407/
        Otherwise, see https://wiki.python.org/moin/CompLangPython or
        the IRC channel #python on irc.freenode.net.)

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-uyh9_v63/cffi/

显然,我希望不必在我的产品映像上安装任何编译器。我是否需要跨
/root/.cache
以外的其他目录进行复制?

Alpine没有manylinux控制盘,因此您需要自己编译它。下面是从安装文档中粘贴的。在同一命令中安装和删除生成依赖项,以仅将包保存到docker映像层

如果你在阿尔卑斯山上,或者只是想自己编译它 密码学需要一个编译器,用于Python的头文件(如果您不是 使用pypy)和OpenSSL和libffi库的头文件 在您的系统上可用

如果您使用的是Python2,请使用Pythondev替换python3 dev

$ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev
如果openssl-dev出现错误,则可能必须使用libressl-dev


我希望我的回答会有用

  • 您应该使用
    --user
    选项在基本阶段通过pip安装加密。示例:
    运行pip安装--用户加密
    。此选项意味着所有文件都将安装在 当前用户的主目录
  • COPY--from=base/root/.local/root/.local
    ,因为加密技术安装在/root/.local中
  • 就这些。完整示例docker多级

    # Base                                                                          
    FROM python:3.6 AS base                                                         
    
    RUN pip install --user cryptography
    
    # Production
    FROM python:3.6-alpine
    
    COPY --from=base /root/.local /root/.local
    
    RUN pip install cryptography \
            && rm -rf /root/.cache
    
    CMD python
    

    我想我在使用PyJWT和一些自定义加密算法时,在某种程度上使用了加密软件包,最后我记得,我不需要在任何地方编译它两次。此外,安装依赖项的理想方法是将所有应用程序库依赖项保存在一个需求文件中,将它从
    Dockerfile
    中复制到容器中,然后在同一Dockerfile中运行
    pip install-r
    。多阶段docker构建(请参阅)的思想是,您可以使用完整映像(如
    python3.6
    )来构建这些库,然后将工件复制到要运行的轻量级映像中。如果我能正确地复制工件,我所概述的方法不应该构建两次库。嗨@JonG,那么你明白了吗?不,对不起。在这种情况下,我倾向于使用slim而不是alpine来构建库。我以为我已经在BaseDocker阶段构建了库。我只是想复制整个结果。类似于他们在这里所做的:。。。那不可能吗?对不起,我来晚了。所以,问题是cffi试图在其setupscript中编译,以查看编译器是否存在。它实际上试图编译字符串,就像配置脚本一样。我不知道能否通过pip绕过这张支票。为了使一切都能在alpine上正常工作(python:3.6是基于debian的),我不会简单地复制包(即编译库和站点包),而是按照我的回答那样做。阿尔卑斯山脉;安装编译器&&安装python依赖项&&删除编译器。编译器将不会提交到image.hi@LoveTäting。您能否提供文档的链接。@StackEdd我已经添加了一个链接。安装工程。但是,当我运行应用程序时,它会显示:无法导入模块“lambda_函数”:libc.musl-x86_64.so.1:无法打开共享对象文件:没有这样的文件或目录。你知道这个吗?