Как установить пакеты Python 3.7 в Docker?

#python #docker #dockerfile

#python #docker #dockerfile

Вопрос:

Я очень новичок в docker. Я создаю docker впервые. Я создал файл Dockerfile и мне нужно добавить пакеты python (в частности, в электронные письма). Однако я получаю сообщение об ошибке при сборке файла docker.

 FROM alpine
MAINTAINER <abc@gmail.com>
FROM python:3.7

RUN pip install --upgrade pip amp;amp; 
    pip install --no-cache-dir nibabel pydicom matplotlib pillow amp;amp; 
    pip install --no-cache-dir med2image

RUN pip install pandas xlsxwriter numpy boto boto3 botocore
RUN pip install oauth2client urllib3 httplib2 email mimetypes apiclient
RUN pip install snowflake.connector

ENV APP_HOME /Users/username/
ENV TZ=America/Los_Angeles

RUN mkdir -p $APP_HOME/code/
WORKDIR $APP_HOME
ENTRYPOINT [ "python"]
  

Я получаю следующую ошибку:

 Downloading https://files.pythonhosted.org/packages/71/e7/816030d3b0426c130040bd068be62b9213357ed02896f5d9badcf46d1b5f/email-4.0.2.tar.gz (1.2MB)
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/usr/local/lib/python3.7/site-packages/setuptools/__init__.py", line 18, in <module>
        import setuptools.version
      File "/usr/local/lib/python3.7/site-packages/setuptools/version.py", line 1, in <module>
        import pkg_resources
      File "/usr/local/lib/python3.7/site-packages/pkg_resources/__init__.py", line 36, in <module>
        import email.parser
      File "/tmp/pip-install-1m3cdjov/email/email/parser.py", line 10, in <module>
        from cStringIO import StringIO
    ModuleNotFoundError: No module named 'cStringIO'

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-1m3cdjov/email/
The command '/bin/sh -c pip install oauth2client urllib3 httplib2 email mimetypes apiclient' returned a non-zero code: 1
  

Я успешно установил эти пакеты в Pycharm, и у меня нет проблем с этим. Я не уверен, как это исправить в docker. Будем признательны за любую помощь.

Комментарии:

1. Похоже, что этот модуль несовместим с python 3.x .

2. Будет интересно увидеть хорошее решение для этого. У меня похожие проблемы с установкой пакетов pip с помощью Docker и Python. В итоге я запустил docker exec -ti my_container bash , а затем установил с pip install помощью. После этого я бы запустил pip freeze > requirements.txt , а затем установил все пакеты из этого файла Dockerfile для всех последующих сборок.

Ответ №1:

Вы также столкнетесь с аналогичной проблемой с модулем «mimetypes». Даже это является частью базы python, и вам не нужно устанавливать его вручную. Кроме того, вы можете иметь все необходимые модули в requirements.txt файл и установите их сразу. Для этого вам необходимо скопировать файл требований в образ docker перед запуском установки.

requirements.txt

 nibabel
pydicom
matplotlib
pillow
med2image
pandas
xlsxwriter
numpy
boto
boto3
botocore
oauth2client
urllib3
httplib2
apiclient
  

Dockerfile

 FROM alpine
MAINTAINER <abc@gmail.com>
FROM python:3.7

COPY requirements.txt /tmp
WORKDIR /tmp
RUN pip install --upgrade pip amp;amp; 
    pip install -r requirements.txt
  

Комментарии:

1. Я почти уверен, что имя репозитория должно быть в нижнем регистре. ИЗ alpine: 3.7 может заменить обе строки 1 и 3 во втором фрагменте кода.

Ответ №2:

Вы не ошиблись. Модуль cStringIO больше не существует. Просто удалите модуль электронной почты из вашей установки pip, поскольку он уже является частью базы python, и вы должны быть готовы к работе.

Комментарии:

1. Теперь он выдает мне ошибку с mimetypes. «Не удалось найти версию, удовлетворяющую требованиям mimetypes (из версий: ) Не найден соответствующий дистрибутив для mimetypes» Это тоже часть базового пакета python?