urllib.error.HTTPError: HTTP Error 404: Not Found in Docker from Ubuntu only

У меня странная проблема. Докер-контейнеры должны предоставлять свои собственные среды, поэтому если они работают на одной хост-платформе, то они должны работать и на любой другой ОС с поддержкой Docker, не так ли? Это то, что я понял как один из основных пунктов продажи Docker'а.

Я использую внешнее приложение, основанное на питере, через предоставленный мне файл Docker'а. Я расширил его конечными точками REST, чтобы вызвать его функции, и делаю из него новое изображение. Докер-файл выглядит следующим образом:

FROM pytorch/pytorch

ARG gh_username=myUsername
ARG service_home="/home/EasyOCR"

# Configure apt and install packages
RUN apt-get update -y && \
    apt-get install -y \
    libglib2.0-0 \
    libsm6 \
    libxext6 \
    libxrender-dev \
    libgl1-mesa-dev \
    git \
    # cleanup
    && apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/li

RUN mkdir "$service_home" \
    && git clone "https://github.com/$gh_username/EasyOCR.git" "$service_home" \
    && cd "$service_home" \
    && git remote add upstream "https://github.com/myUsername/EasyOCR.git" \
    && git pull upstream master

# Build
RUN cd "$service_home" \
    python setup.py build_ext --inplace -j 4 \
    && python -m pip install -e .

WORKDIR "$service_home/server"

COPY ./python-server/. "."
RUN pip install -r "requirements.txt"
EXPOSE 5050  # gunicorn is hosted on port 0.0.0.0:5050
ENTRYPOINT ["gunicorn", "--config", "gunicorn_config.py", "wsgi"]
CMD ["--gpus all"]

и docker-compose.yml:

easy-ocr:
  build: .
  image: myUsername/easy-ocr
  container_name: easy-ocr
  ports:
    - 5050:5050

Запуск этого образа на моей Windows машине (с Docker Desktop WSL2) работает нормально. Я могу вызвать конечные точки и получить ожидаемые ответы. Однако когда я пытаюсь запустить его на Ubuntu 20.04, я получаю следующую ошибку во время выполнения в контейнере:

easy-ocr         | [2020-12-13 18:56:42 +0000] [8] [ERROR] Exception in worker process
easy-ocr         | Traceback (most recent call last):
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
easy-ocr         |     worker.init_process()
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/workers/base.py", line 119, in init_process
easy-ocr         |     self.load_wsgi()
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
easy-ocr         |     self.wsgi = self.app.wsgi()
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
easy-ocr         |     self.callable = self.load()
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
easy-ocr         |     return self.load_wsgiapp()
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
easy-ocr         |     return util.import_app(self.app_uri)
easy-ocr         |   File "/opt/conda/lib/python3.8/site-packages/gunicorn/util.py", line 358, in import_app
easy-ocr         |     mod = importlib.import_module(module)
easy-ocr         |   File "/opt/conda/lib/python3.8/importlib/__init__.py", line 127, in import_module
easy-ocr         |     return _bootstrap._gcd_import(name[level:], package, level)
easy-ocr         |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
easy-ocr         |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
easy-ocr         |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
easy-ocr         |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
easy-ocr         |   File "<frozen importlib._bootstrap_external>", line 783, in exec_module
easy-ocr         |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
easy-ocr         |   File "/home/EasyOCR/server/wsgi.py", line 1, in <module>
easy-ocr         |     from app import app as application
easy-ocr         |   File "/home/EasyOCR/server/app.py", line 1, in <module>
easy-ocr         |     import ocr
easy-ocr         |   File "/home/EasyOCR/server/ocr.py", line 4, in <module>
easy-ocr         |     'ch_sim': easyocr.Reader(['ch_sim']),
easy-ocr         |   File "/home/EasyOCR/easyocr/easyocr.py", line 82, in __init__
easy-ocr         |     download_and_unzip(model_url['detector'][0], DETECTOR_FILENAME, self.model_storage_directory)
easy-ocr         |   File "/home/EasyOCR/easyocr/utils.py", line 540, in download_and_unzip
easy-ocr         |     urlretrieve(url, zip_path,reporthook=printProgressBar(prefix = 'Progress:', suffix = 'Complete', length = 50))
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 247, in urlretrieve
easy-ocr         |     with contextlib.closing(urlopen(url, data)) as fp:
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 222, in urlopen
easy-ocr         |     return opener.open(url, data, timeout)
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 531, in open
easy-ocr         |     response = meth(req, response)
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 640, in http_response
easy-ocr         |     response = self.parent.error(
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 569, in error
easy-ocr         |     return self._call_chain(*args)
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 502, in _call_chain
easy-ocr         |     result = func(*args)
easy-ocr         |   File "/opt/conda/lib/python3.8/urllib/request.py", line 649, in http_error_default
easy-ocr         |     raise HTTPError(req.full_url, code, msg, hdrs, fp)
easy-ocr         | urllib.error.HTTPError: HTTP Error 404: Not Found
easy-ocr         | [2020-12-13 18:56:42 +0000] [8] [INFO] Worker exiting (pid: 8)

Он внезапно жалуется на пакет request.urllib, но у него не возникало проблем, когда я запускал этот образ Docker на Windows? Я уверен, что образ Docker тот же самый. Версия docker-compos в Windows - 1.27.4 и в Ubuntu - 1.25.0. Я искренне надеюсь, что это не является возможной причиной для данного вопроса.

В качестве проверки здравомыслия, я решил запустить питоновое приложение вне контейнера Docker и запустить gunicorn --config gunicorn_config.py wsgi, и это работает!

Я абсолютный новичок в Linux, так что я, возможно, упускаю из виду что-то базовое. Что может быть причиной этой проблемы?

0
задан 13 December 2020 в 22:35

1 ответ

Я нашел ответ, и он очень глупый. Извлекаемый ресурс не существует... Я разветвил репозиторий, и код ссылается на активы из выпусков исходного репозитория. После некоторого тестирования я изменил ссылки в своем разветвленном репозитории, чтобы они указывали на мои собственные выпуски, которые, как мне казалось, включали все. Все казалось хорошо.

Затем я попытался запустить то же самое в Ubuntu в первый раз, и это не удалось, потому что необходимые пакеты не были скопированы с форком. Некоторые из них были скопированы, а некоторые нет, поэтому я не уверен, какие правила существуют для вилок. Во всяком случае, у меня была иллюзия, что они у меня есть, потому что Windows продолжала их «находить». Так почему же это продолжалось успешно в Windows, несмотря на то, что я удалил существующие тома и образы? Судя по всему, он хранил в кеше эту строку:

RUN mkdir "$service_home" \
    && git clone "https://github.com/$gh_username/EasyOCR.git" "$service_home" \
    && cd "$service_home" \
    && git remote add upstream "https://github.com/AlexanderTang/EasyOCR.git" \
    && git pull upstream master

Несмотря на то, что я изменил пользователя для ARG gh_username на моего собственного пользователя, он по-прежнему продолжал использовать старое значение для извлечения из репозитория. Это означает, что он никогда не попадал в мой разветвленный репозиторий, а в исходный.

Инициирование изменения в строке приводит к удалению кеша и заставляет Docker переоценить строку. Когда я явно заменяю $gh_username своим собственным пользователем (git clone "https://github.com/myUsername/EasyOCR.git"), он (правильно) получает ту же ошибку Я получаю на Ubuntu.

0
ответ дан 13 December 2020 в 22:47

Другие вопросы по тегам:

Похожие вопросы: