У меня есть скрипт python3.6, который должен получать содержимое из хранилища больших двоичных объектов в Azure, которое я хочу запустить в док-контейнере Ubuntu 16.04.
Проблема
Я использую это dockerfile, потому что я также использую pyodbc для подключения к SQL Server.В моем файле требований я перечислил azure.storage
, который устанавливается при сборке образа докера.Но при попытке запустить скрипт я получаю следующую ошибку:
root@b61c65dadb5d:/app# python3 val.py
Traceback (most recent call last):
File "val.py", line 12, in <module>
from azure.storage.blob import BlockBlobService
File "/usr/local/lib/python3.6/dist-packages/azure/storage/__init__.py", line 21, in <module>
from .models import (
File "/usr/local/lib/python3.6/dist-packages/azure/storage/models.py", line 27, in <module>
from cryptography.hazmat.primitives.keywrap import(
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/primitives/keywrap.py", line 12, in <module>
from cryptography.hazmat.primitives.constant_time import bytes_eq
File "/usr/local/lib/python3.6/dist-packages/cryptography/hazmat/primitives/constant_time.py", line 11, in <module>
from cryptography.hazmat.bindings._constant_time import lib
ImportError: No module named '_cffi_backend'
Что я пробовал
Я нашел пару предложений после некоторого поиска, одно из которых предложило запустить pip install cffi
.При попытке этого я получаю:
root@b61c65dadb5d:/app# pip3 install cffi
Requirement already satisfied: cffi in /usr/local/lib/python3.6/dist-packages (1.12.2)
Requirement already satisfied: pycparser in /usr/local/lib/python3.6/dist-packages (from cffi) (2.19)
То же самое относится к pip install cryptography
Поскольку у Python возникли проблемы с поиском модуля Azure, для начала у меня это есть в начале моего скрипта, поэтомудолжен быть в состоянии найти что-нибудь, находящееся в этом каталоге:
import sys
sys.path.append('/usr/local/lib/python3.6/dist-packages')
(я знаю, что могу сделать это в Dockerfile, и я это сделаю)
Другие говорят, что добавление import cffi
вСценарий Python решает проблему.Это не для меня.
Как воспроизвести
Эта проблема может быть легко воспроизведена с помощью этого минимального скрипта Python:
import sys
sys.path.append('/usr/local/lib/python3.6/dist-packages')
from azure.storage.blob import BlockBlobService
Затем создайте образ на основе Ubuntu 16.04, установка python 3.6 и установка azure.storage с помощью pip.Dockerfile:
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y apt-utils
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:jonathonf/python-3.6
RUN apt-get update && apt-get install -y \
python3.6 \
python3.6-dev \
python3-pip \
python3-setuptools \
python3-wheel \
--no-install-recommends && \
python3.6 -m pip install --upgrade pip && \
rm -rf /var/lib/apt/lists/* && \
alias python=python3.6
RUN pip3 install azure.storage
COPY /app /app
WORKDIR /app
Либо запустите его в интерактивном режиме, либо добавьте CMD для запуска скрипта.Обратите внимание, что скрипт python должен находиться в папке с именем app в том же каталоге, что и Dockerfile.
Если вы используете interacive, вы можете попробовать pip3 install cffi
, чтобы убедиться, что он уже установлен.
Примечание:
Я также хочу упомянуть, что у меня возникает похожая проблема при попытке подключиться к служебной шине Azure.Но я создам другой вопрос для этой специфической проблемы, если почувствую необходимость позже.