Вопрос или проблема
Я пытаюсь создать образ Docker с требованиями, указанными в requirements.txt
. Однако, пытаясь собрать файл, я получаю следующую ошибку:
E: Не удалось получить http://us.archive.ubuntu.com/ubuntu/pool/main/l/linux-atm/libatm1_2.5.1-1.5_amd64.deb 400 Неверный запрос [IP: 91.189.91.39 80]
E: Не удалось получить http://us.archive.ubuntu.com/ubuntu/pool/main/p/popt/libpopt0_1.16-10_amd64.deb 400 Неверный запрос [IP: 91.189.91.39 80]
E: Не удалось получить http://us.archive.ubuntu.com/ubuntu/pool/main/libc/libcap-ng/libcap-ng0_0.7.7-1_amd64.deb 400 Неверный запрос [IP: 91.189.91.39 80]
Я пытался сменить зеркала, проверил вывод cat /etc/apt/sources.list, пытался добавить флаг –fix-missing и пытался создать образ с –no-cache, но все напрасно.
Вот Dockerfile:
# Базовый образ
FROM ubuntu:16.04
MAINTAINER Siddhanth Ajri "[email protected]"
RUN cat /etc/apt/sources.list
# Смена на американские зеркала UBUNTU
RUN sed -i'' 's/archive\.ubuntu\.com/us\.archive\.ubuntu\.com/' /etc/apt/sources.list
# Установка зависимостей
RUN apt-get update && apt-get install -y \
software-properties-common \
curl \
git
#RUN add-apt-repository universe
RUN apt-get update && apt-get install -y \
curl \
git
RUN apt-get install python3.7
RUN apt-get install python3-pip
# Обновление pip до версии 20.x
RUN pip3 install -U pip
COPY ./requirements.txt /requirements.txt
WORKDIR /
RUN pip3 install -r requirements.txt
COPY . /
Ни одно из упомянутых решений, которые я пока нашел, не смогло решить эту проблему для меня.
Мне удалось обойти эту очень раздражающую проблему, настроив HTTP-прокси apt так, чтобы использовать мой интернет-прокси напрямую. Неясно, почему невидимый прокси работает для некоторых пакетов, но не для других, но явная установка прокси решила проблему.
Смотрите Невозможно установить пакеты с помощью apt-get update в Debian (Proxy) для примеров настройки прокси.
Я использовал метод /etc/apt/apt.conf.d/30proxy.conf
, создав файл, который содержал:
Acquire::http { Proxy "http://192.168.0.1:3128" }
где http://192.168.0.1:3128
— это прокси squid.
Ответ или решение
Ошибка Bad Request 400 при попытке установить пакеты с помощью apt-get в Docker Ubuntu 16.04
При работе с Docker и попытке собрать образ на базе Ubuntu 16.04, многие пользователи сталкиваются с ошибками при выполнении команды apt-get install
. В вашем случае ошибка звучит как "400 Bad Request", что указывает на проблемы с соединением при попытке загрузить пакеты. Давайте рассмотрим возможные причины и решения этой проблемы.
Причины
-
Проблемы с репозиториями: Основная причина таких проблем обычно заключается в том, что репозиторий, к которому вы обращаетесь, недоступен или имеет неправильную конфигурацию. Похоже, что вы уже поменяли зеркало и проверили файл
sources.list
, что является правильным шагом. -
Неправильная конфигурация прокси: Если вы находитесь за корпоративным или локальным прокси, пакетный менеджер может иметь проблемы с доступом к репозиториям. Это может привести к ошибкам 400.
-
Сетевые проблемы: Иногда в связи с перегрузками или сбоями в сети могут возникнуть временные проблемы с доступом к репозиториям.
Решения
-
Проверка и изменение репозиториев:
Убедитесь, что вы используете актуальные зеркала. В файле/etc/apt/sources.list
проверьте, чтобы строки выглядели примерно так:deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse
Обратитесь к официальной документации для получения актуальных зеркал и их конфигурации.
-
Настройка прокси:
Если вы находитесь за прокси, следующая конфигурация может решить вашу проблему. Создайте файл/etc/apt/apt.conf.d/30proxy.conf
и добавьте в него содержание:Acquire::http::Proxy "http://192.168.0.1:3128";
Убедитесь, что
192.168.0.1:3128
— это ваш корректный адрес прокси. Эта настройка помогаетapt
корректно взаимодействовать с сетью. -
Отключение IPv6:
В некоторых случаях проблемы могут быть связаны с использованием IPv6. Попробуйте временно отключить его, добавив строку в файл/etc/sysctl.conf
:net.ipv6.conf.all.disable_ipv6 = 1
После внесения изменений выполните команду:
sudo sysctl -p
-
Проверка DNS:
Иногда проблемы могут возникать из-за неправильно настроенных DNS. Попробуйте использовать общедоступные DNS-серверы, такие как Google (8.8.8.8 и 8.8.4.4). Вы можете добавить их в файл/etc/resolv.conf
:nameserver 8.8.8.8 nameserver 8.8.4.4
-
Логи и диагностика:
Если вышеуказанные шаги не помогут, вы можете также просмотреть логи Docker иapt
. Это может дать больше информации о том, что именно идет не так. Запустите команду:docker logs <container_id>
Заключение
Ошибка "400 Bad Request" при выполнении команд apt-get
в Docker на Ubuntu 16.04 может быть вызвана различными факторами, включая неправильные конфигурации репозиториев или проблемы с прокси. Опираясь на представленные рекомендации, вы сможете диагностировать и решить проблему. Не забывайте, также, проверять стабильность соединения с интернетом и возможность доступа к репозиториям из вашей сети.