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

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

5 ответов


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

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

  • еще воспроизвести проблему; 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  }' | sed -e 's@<http://\(.*\)/debian/>;@@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.

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

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

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

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

  2. вместо используйте этот вместо этого:

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

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

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


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


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

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