Криптография Python Docker многоступенчатая сборка

У меня есть проект Python, который выполняется в Docker-контейнере, и я пытаюсь преобразовать в многоступенчатый процесс сборки 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://stackru.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?

1 ответ

Для Alpine нет колеса manylinux, поэтому вам нужно скомпилировать его самостоятельно. Ниже наклеивается документация по установке. Установите и удалите зависимости сборки в той же команде, чтобы сохранить только пакет в слой образа докера.

Если вы используете Alpine или просто хотите скомпилировать его самостоятельно, тогда для криптографии требуется компилятор, заголовки для Python (если вы не используете pypy) и заголовки для библиотек OpenSSL и libffi, доступных в вашей системе.

Alpine Замените python3-dev на python-dev, если вы используете Python 2.

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

Если вы получили ошибку с openssl-dev, возможно, вам придется использовать libressl-dev.

Документы можно найти здесь

Надеюсь, мой ответ будет полезен.

  1. Вы должны использовать --userвозможность установки криптографии через pip на базовой стадии. Пример:RUN pip install --user cryptography. Эта опция означает, что все файлы будут установлены в.local каталог домашнего каталога текущего пользователя.
  2. COPY --from=base /root/.local /root/.local, потому что криптография установлена ​​в /root/.local.

Вот и все. Полный пример многоступенчатого докера

# 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
Другие вопросы по тегам