Docker Debian apt Ошибка чтения с сервера

Казалось бы, у apt-get возникают проблемы с подключением к серверам репозитория. Я полагаю, что это проблемы совместимости, как уже упоминалось здесь, однако предлагаемое решение apt-get clean не работает для меня Также меня удивляет, если это так, что у меня больше нет людей, имеющих мою проблему.

MWE

Dockerfile

FROM debian:jessie
RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends \
    git
$ docker build .
docker build .
Sending build context to Docker daemon 2.048 kB
Step 0 : FROM debian:jessie
---> 4a5e6db8c069
Step 1 : RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends     git
---> Running in 43b93e93feab
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB]
... some omitted ...
Get:6 http://httpredir.debian.org jessie-updates/main amd64 Packages [3614 B]
Fetched 9552 kB in 7s (1346 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following extra packages will be installed:
... some omitted ...
0 upgraded, 26 newly installed, 0 to remove and 0 not upgraded.
Need to get 13.2 MB of archives.
After this operation, 64.0 MB of additional disk space will be used.
Get:1 http://security.debian.org/ jessie/updates/main libgnutls-deb0-28 amd64 3.3.8-6+deb8u2 [694 kB]
... some omitted ...
Get:5 http://httpredir.debian.org/debian/ jessie/main libnettle4 amd64 2.7.1-5 [176 kB]
Err http://httpredir.debian.org/debian/ jessie/main libffi6 amd64 3.1-2+b2
  Error reading from server. Remote end closed connection [IP: 176.9.184.93 80]
... some omitted ...
Get:25 http://httpredir.debian.org/debian/ jessie/main git amd64 1:2.1.4-2.1 [3624 kB]
Fetched 13.2 MB in 10s (1307 kB/s)
E: Failed to fetch http://httpredir.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_amd64.deb  Error reading from server. Remote end closed connection [IP: 176.9.184.93 80]

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
The command '/bin/sh -c apt-get clean && apt-get update && apt-get install -y --no-install-recommends     git' returned a non-zero code: 100

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

6 ответов

Решение

Зеркало http://httpredir.debian.org/ является "волшебным" в том смысле, что оно будет балансировать нагрузку и гео-ip для прозрачного увеличения производительности и доступности. Поэтому я бы сразу заподозрил, что это вызвало вашу проблему, или, по крайней мере, первым, кто исключит это.

Я бы проверил, если бы вы могли:

  • Все еще воспроизведите проблему; httpredir.debian.org удалит "плохие" зеркала из своих внутренних списков, так что ваша проблема могла быть временной.

  • Воспроизведите проблему с другим, не httpredir.debian.org зеркало. Попробуйте что-то вроде ftp.de.debian.org, Если это работает с этим зеркалом, пожалуйста, свяжитесь с httpredir.debian.org сопровождающий и сообщить о проблеме им. Они довольно отзывчивы и открыты для сообщений об ошибках.

Для тех, у кого есть проблемы с этим, это моя попытка "исправить" проблему путем замены httpredir с одним рабочим доменом при сборке Dockerfile:

FROM debian:je...

# Insert this line before "RUN apt-get update" to dynamically
# replace httpredir.debian.org with a single working domain
# in attempt to "prevent" the "Error reading from server" error.
RUN sed -i "s/httpredir.debian.org/`curl -s -D - http://httpredir.debian.org/demo/debian/ | awk '/^Link:/ { print $2 }' | sed -e 's@<http://\(.*\)/debian/>;@\1@g'`/" /etc/apt/sources.list

# Continue with your apt-get update...
RUN apt-get update...

Что эта команда делает:

  1. Свернуть http://httpredir.debian.org/demo/debian/ со сборочной машины, чтобы получить заголовки с демонстрационной страницы Debian (-s молчит, не выводить. -D это сваливать заголовки)
  2. Извлеките заголовки, найдите Link фрагмент заголовка. Это содержит лучший маршрут в соответствии с рекомендациями httpredir.
  3. Последний sed -e ... заключается в извлечении доменного имени ссылки на шаге 2.
  4. Затем, наконец, домен, найденный на шаге 3, передается в глобальную команду sed и заменяет домен httpredir.debian.org нашел в /etc/apt/sources.list,

Это не исправление, а скорее простой взлом, чтобы (значительно) уменьшить вероятность неудачной сборки. И... простите меня, если это выглядит странно, так как это моя девственная попытка суеты.

редактировать

Кроме того, если домен, который он выбирает, просто слишком медленный или не отвечает должным образом, вы можете сделать это вручную,

  1. Посетите http://httpredir.debian.org/demo.html, и вы должны увидеть ссылку там, как http://......./debian/, Например, в момент написания я видел http://mirrors.tuna.tsinghua.edu.cn/debian/

  2. Вместо длинного RUN sed -i.... используйте команду вместо этого:

    RUN sed -i "s/httpredir.debian.org/mirrors.tuna.tsinghua.edu.cn/" /etc/apt/sources.list
    

Я добавил apt-get clean в мой докер-файл до apt-get update линия, кажется, сделала свое дело.

Я думаю, у меня нет никакого способа узнать, была ли это дополнительная команда, или это была удача, которая исправила мою сборку, но я воспользовался советом от https://github.com/CGAL/cgal-testsuite-dockerfiles/issues/19

Я смог решить эту проблему, добавив -o 'Acquire::Retries=3'к apt-get installкоманда.

      RUN apt-get update && apt-get install -o 'Acquire::Retries=3' -y git

Кажется, что он автоматически повторяет попытку получить пакет с другого зеркала.

apt-получить документацию

РЕДАКТИРОВАТЬ: После некоторого расследования я обнаружил, что моя проблема связана с прокси-сервером, который я использовал. Я все равно оставлю ответ здесь, если он кому-то поможет.

Для тех, кто посещает с похожими проблемами, используя --no-cache флаг в docker build может помочь Подобные проблемы (хотя и не точные) могут возникнуть, если обновление apt-get устарело и не вызывается из-за кеширования.

Не хватает репутации, чтобы комментировать предыдущие ответы, поэтому я (смущенно) добавлю новый ответ:

  • Я не думаю, что жесткое кодирование одного зеркала действительно жизнеспособное решение, поскольку, как, например, видно здесь, есть причина, по которой debian реализовал всю функцию httpredir - зеркала перестали работать или устарели.
  • Я много раз сталкивался с этой проблемой, и в журналах всегда указывалось, что докер действительно запускает команду apt-get, а это значит, что --no-cache вряд ли это исправит - просто если вы перестроите, httpredir Скорее всего, выберет другое зеркало, даже если вы ничего не измените в файле Docker, и сборка будет работать.
Другие вопросы по тегам