Проблемы с Docker на wsl (ubuntu 22.04)

Попытка создать образ докера завершается с ошибкой на шаге RUN pip install -r requirements.txt со следующей ошибкой:

WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/asgiref/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/asgiref/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/asgiref/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/asgiref/`

почему-то asgiref==3.5.2 не хочет устанавливаться. Что может быть причиной этого?

Используемая система:

  • ОС: Виндовс 11
  • WSL 2 с Ubuntu 22.04 на борту
  • Докер версии 20.10.19, сборка d85ef84.
  • Содержимое докерфайла:
# Pull base image
FROM python:3.10.6-slim-bullseye

# Set enviroment variables

ENV PIP_DISABLE_PIP_VERSION_CHECK 1
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set work directory

WORKDIR /code

# Install dependencies

COPY ./requirements.txt .
RUN pip install -r requirements.txt

# Copy project

COPY . .
  • Требования.txt содержание:
asgiref==3.5.2
Django==4.1.2
sqlparse==0.4.3

Вы получаете сообщение об ошибке тайм-аута при попытке подключения к pypi.org. Возможно, это связано с брандмауэром? Это на работе, где у вас могут быть политики сетевой безопасности?

michjnich 17.10.2022 21:55

Вы также можете попробовать увеличить время ожидания, используя что-то вроде --default-timeout=100 при запуске pip.

michjnich 17.10.2022 21:58

@michjnich спасибо за правки и ваши комментарии. Почему-то сейчас показывает следующее: ERROR: Could not find a version that satisfies the requirement asgiref==3.5.2 (from versions: none) ERROR: No matching distribution found for asgiref==3.5.2

Bogdan Kozlovskyi 18.10.2022 09:47

@michjnich, что абсурдно, версии Python и PIP такие же, как и используемые в виртуальной среде, и django4 вместе с asgiref прекрасно там установлены. Непонятно в чем дело....

Bogdan Kozlovskyi 18.10.2022 09:48

Это при беге docker build . ? Я скопировал ваши 2 файла в пустой проект, и у меня все работает. Если у вас проблемы локально, просто убедитесь, что вы используете правильные версии ... python --version - для asgiref 3.5.2 требуется версия 3.7 и выше.

michjnich 18.10.2022 12:01

@michjnich да, это когда я бегу docker build . . Я использую версию Python 3.10.6, так что все должно быть в порядке. Вы пробовали это под WSL?

Bogdan Kozlovskyi 18.10.2022 16:07

Запустил его в докере под wsl2, и все заработало. Интересный ответ ниже, хотя - любопытно посмотреть, сработает ли он для вас...

michjnich 18.10.2022 18:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
502
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

У меня была эта проблема сегодня. Итак, вы можете решить эту проблему с помощью --network host в строке сборки Docker.

Причиной этого является несоответствие MTU ваших сетевых интерфейсов. Если вы откроете базовый образ из своего Dockerfile в интерактивном режиме: sudo docker run -it {your base image repo} /bin/bash, и запустите ip a, а затем сделаете то же самое на своей хост-ОС, вы, вероятно, обнаружите, что они разные. Это означает, что мост Docker отбрасывает пакеты/не удается передать. Если вы хотите, чтобы мостовая сеть работала, а не хост, создайте файл в своей хост-ОС по адресу /etc/docker/daemon.json с содержимым.

{
    "mtu": whatever_your_host_os_MTU_is
}

а затем запустите sudo systemctl restart docker, это, вероятно, должно исправить вашу сеть моста.

Обновлено: я должен добавить, что это только в том случае (скорее всего), если у вас есть подключение к Интернету из вашего контейнера (т.е. apt/yum работает, но что-то еще, например, прерывается). Если вы ничего не можете получить, у вас, вероятно, проблема с DNS/брандмауэром.

Да! На самом деле это было так, добавление --network host к команде решило проблему. Благодаря тонну!

Bogdan Kozlovskyi 19.10.2022 08:46

нет проблем, и да, если вы хотите использовать мостовую сеть (хост-сеть может быть проблемой, поскольку она сопоставляет порты контейнера докеров непосредственно с портами вашей хост-ОС, поэтому может вызвать конфликты), вам придется выполнить шаги, описанные выше.

e god 19.10.2022 11:22

попытался добавить daemon.json и установить MTU, но это не дало никакого эффекта после перезапуска демона докеров, к сожалению (есть другие идеи, как решить эту проблему? Даже если запустить контейнер докеров, а затем запустить «подходящее обновление», я получаю «Временное ошибка разрешения 'deb.debian.org''.

Bogdan Kozlovskyi 22.10.2022 12:21

Похоже, основная проблема заключалась в том, что я установил докер прямо из своего дистрибутива Ubuntu WSL2, используя инструкции для Linux, а не с помощью официального установщика Windows, который легко интегрируется с WSL2. Переустановил и теперь сеть работает как задумано. Спасибо всем!

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