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 может выбрать другое зеркало, даже если вы ничего не измените в своем файле докеров, и сборка будет работать.