1

我有一个在 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 要求,例如pycryptoand 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?

4

2 回答 2

1

Alpine 没有 manylinux 轮子,需要自己编译。下面是从安装文档中粘贴的。在同一命令中安装和删除构建依赖项,仅将包保存到 docker 镜像层。

如果你在 Alpine 上或者只是想自己编译它,那么密码学需要一个编译器、Python 的头文件(如果你不使用 pypy),以及系统上可用的 OpenSSL 和 libffi 库的头文件。

如果您使用的是 Python 2,Alpine 将 python3-dev 替换为 python-dev。

$ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev

如果您在使用 openssl-dev 时遇到错误,您可能必须使用 libressl-dev。

文档可以在这里找到

于 2018-03-02T18:57:48.537 回答
0

我希望,我的回答会有用。

  1. 您应该--user在基础阶段使用通过 pip 进行加密安装的选项。示例:RUN pip install --user cryptography。此选项意味着,所有文件都将安装在.local当前用户主目录的目录中。
  2. 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
于 2020-05-17T16:26:12.437 回答