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

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

Ответ 1

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

Я бы проверить, можете ли вы:

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

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

Ответ 2

Для тех, у кого есть проблема с этим, это моя попытка "исправить" проблему путем замены 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 '[email protected]<http://\(.*\)/debian/>;@\[email protected]'`/" /etc/apt/sources.list

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

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

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

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

Изменить

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

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

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

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

Ответ 3

Я добавил apt-get clean в свой файл докеров перед строкой apt-get update, похоже, сделал трюк.

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

Ответ 4

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

Ответ 5

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

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