import boto3 ImportError: нет модуля с именем док-контейнера boto3

avatar
Ramesh Raj
1 июля 2021 в 18:46
1451
1
1

Я пытаюсь развернуть код из bitbucket в AWS Elastic beanstalk. При развертывании кода из битбакета я столкнулся с проблемой импорта boto3.

Но мой старый образ докера работает нормально.

СТАРЫЙ файл Docker

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1    
 RUN apk add --update --no-cache build-base python3-dev python3 libffi-dev libressl-dev bash git gettext ca-certificates curl groff less zip libstdc++ jq \
  && curl -O https://bootstrap.pypa.io/get-pip.py \
  && python3 get-pip.py \
  && pip install --upgrade --use-feature=2020-resolver six awscli awsebcli \
  && rm -rf /var/cache/apk/* 
  
 RUN apk --no-cache add python py-pip \
  && pip --no-cache-dir install --upgrade pip \
  && pip --no-cache-dir install --upgrade --user boto3 boto
 
 RUN apk update && \
     apk add --no-cache git openssh perl && \
     pip install pytz tzlocal

в Python2.7 все работает нормально. когда я обновляю версию Python с 2.7 до 3.7, получаю эту ошибку импорта boto3.

Файл Docker

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1    
 RUN apk add --update --no-cache build-base python3-dev python3 libffi-dev libressl-dev bash git gettext ca-certificates curl groff less zip libstdc++ jq py3-pip\
  && pip3 install  --upgrade six awscli awsebcli \
  && rm -rf /var/cache/apk/* 
  
 RUN apk --no-cache add python3 py3-pip\
  && python3 -m venv env-env \
  && source env-env/bin/activate \
  && pip3 install --upgrade pip \
  && pip3 install --upgrade boto3 
 RUN apk update  && \
     apk add --no-cache git openssh perl && \
     python3 -m venv env-env && \
     source env-env/bin/activate && \
     pip3 install pytz tzlocal
 ENV PATH "$PATH:~/.local/bin"
 
 ADD deployment-scripts /opt/deployment-scripts

Сценарий Python

from __future__ import print_function
import os
import sys
from time import strftime, sleep
import boto3
from botocore.exceptions import ClientError
from time import strftime
from datetime import datetime
from pytz import timezone
from tzlocal import get_localzone

когда я запускаю этот файл скрипта, я получаю

import boto3 ImportError: Нет модуля с именем boto3

я пытался

python3 -m pip install boto3

но я получаю ту же ошибку при запуске скрипта. помогите мне с этим.

Согласно документу по обновлению Python https://boto3.amazonaws.com/v1/documentation/api/1.16.56/guide/migrationpy3.html

мы должны перейти с python 2.7 на python3.7

Источник

Ответы (1)

avatar
larsks
1 июля 2021 в 19:52
3

Вы установили boto3 только в виртуальной среде env-env. Если вы хотите использовать этот модуль, вам нужно сначала активировать среду.

Сравнить:

/ # which python3
/usr/bin/python3
/ # python3
Python 3.9.5 (default, May 12 2021, 20:44:22)
[GCC 10.3.1 20210424] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'boto3'

С:

/ # . env-env/bin/activate
(env-env) / # which python3
/env-env/bin/python3
(env-env) / # python3
Python 3.9.5 (default, May 12 2021, 20:44:22)
[GCC 10.3.1 20210424] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto3
>>>

Другое решение — не использовать виртуальную среду. Это не ясно, почему вы его создаете, так как вы создаете образ контейнера -- обычные причины для создания изолированной среды Python для большая часть не применяется, потому что сам контейнер будет вашим изоляция.


Кстати, это...

 ENV PATH "$PATH:~/.local/bin"

... делает не то, что вы думаете. Ключевое слово ENV не расширяет ~, так что вы получите путь, содержащий литерал ~, который ничему не соответствует. Кроме того, $PATH будет соответствовать значению $PATH на вашем хосте, не, каково бы ни было значение контейнера по умолчанию, поэтому вы можете в конечном итоге определить значение для $PATH, содержащее множество каталогов, которые не существует.


В вашем Dockerfile происходит много такого, в чем я не уверен необходимо (поскольку я не запускаю ваш код). Этого было достаточно, чтобы позвольте мне написать код Python, который использует модуль boto3:

FROM alpine:latest

ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
RUN apk add --update --no-cache \
    build-base \
    ca-certificates \
    curl \
    git \
    py3-cryptography \
    py3-pip \
    python3 \
    python3-dev \
    zip

RUN pip3 install --upgrade \
    boto3 \
    pytz \
    tzlocal
Ramesh Raj
1 июля 2021 в 20:26
0

когда я строю без виртуальной среды, я получаю «предупреждение: запуск pip от имени пользователя root может привести к нарушению разрешений и конфликтному поведению с системным менеджером пакетов. Вместо этого рекомендуется использовать виртуальную среду: pip.pypa. io/warnings/venv". вот почему я использую переменную env

Ramesh Raj
1 июля 2021 в 20:28
0

спасибо за быстрый ответ. Я попробовал RUN apk --no-cache add python3 py3-pip\ && pip3 install --upgrade pip \ && pip3 install --upgrade boto3, но я получил ту же ошибку, что и ошибка импорта boto3.

larsks
1 июля 2021 в 20:28
0

У вас есть два варианта (а) игнорировать ошибку или (б) правильно активировать виртуальную среду. Любое решение будет работать, хотя (а), возможно, немного проще.

Ramesh Raj
1 июля 2021 в 21:12
0

RUN apk --no-cache add python3 py3-pip\ && python3 -m pip install --upgrade pip \ && python3 -m pip install --upgrade boto3 это должно работать, я прав, larsks?

larsks
1 июля 2021 в 21:50
0

Я обновил ответ с помощью Dockerfile, который мне подходит.

Ramesh Raj
4 июля 2021 в 04:05
0

я тоже пробовал это, но я получил ту же ошибку.

Ramesh Raj
8 июля 2021 в 05:42
0

спасибо @Larsks, все работало нормально. проблема была в моей переменной