Docker Debian apt Error Reading from Server
For whoever is having an issue with this, this is my attempt to "fix" the issue by swapping out httpredir
with a single working domain whenever the Dockerfile is being built:
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...
What this command does is:
- Curl the
http://httpredir.debian.org/demo/debian/
from the building machine to get the headers from debian demo page (-s
is silent, don't output.-D
is to dump headers) - Extract the headers, find the
Link
header fragment. This contains the best route as recommended by httpredir. - The last
sed -e ...
is to extract out the domain name of the link in step 2. - Then finally, the domain found in step 3 is being feed into the global sed command, and replace the domain
httpredir.debian.org
found in/etc/apt/sources.list
.
This is not a fix, but rather a simple hack to (greatly) reduce the chances of failed build. And... pardon me if it looks weird, as it's my virgin sed & piping attempt.
Edit
On a side note, if the domain that it picks simply too slow or not responding as it should, you may want to do it manually by
Visit http://httpredir.debian.org/demo.html, and you should see a link there like
http://......./debian/
. For example, at the point of writing, I sawhttp://mirrors.tuna.tsinghua.edu.cn/debian/
Instead of the long
RUN sed -i....
command, use this instead:RUN sed -i "s/httpredir.debian.org/mirrors.tuna.tsinghua.edu.cn/" /etc/apt/sources.list
The httpredir.debian.org mirror is "magic" in that it will load-balance and geo-ip you to transparent increase performance and availability. I would therefore immediately suspect it of causing your problem, or at least be the first thing to rule out.
I would check if you could:
Still reproduce the problem;
httpredir.debian.org
will throw out "bad" mirrors from its internal lists so your issue may have been temporary.Reproduce the problem with a different, non-
httpredir.debian.org
mirror. Try something likeftp.de.debian.org
. If it then works with this mirror, do please contact thehttpredir.debian.org
maintainer and report the issue to them. They are quite responsive and open to bug reports.
I added apt-get clean
to my dockerfile before the apt-get update
line, it seems to have done the trick.
I guess I have no way of knowing whether or not it was the extra command or if it was luck that fixed my build, but I took the advice from https://github.com/CGAL/cgal-testsuite-dockerfiles/issues/19