从服务器读取Docker Debian apt时出错

从服务器读取Docker Debian apt时出错,docker,debian,apt-get,Docker,Debian,Apt Get,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 请注意,我也发布了一个

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
请注意,我也发布了一个不同的问题。我认为这是不相关的,但实际上很可能是。

镜像的“魔力”在于它将负载平衡和地理ip透明地提高您的性能和可用性。因此,我会立即怀疑它会导致你的问题,或者至少是第一件要排除的事情

我会检查您是否可以:

  • 仍然重现问题
    httpredir.debian.org
    将从其内部列表中抛出“坏”镜像,因此您的问题可能是暂时的

  • 使用不同的非httpredir.debian.orgmirror重现问题。尝试类似于
    ftp.de.debian.org
    的方法。如果它与此镜像一起工作,请联系
    httpredir.debian.org
    维护人员并向他们报告问题。他们的反应非常迅速,并且对bug报告持开放态度


apt get update
行之前,我将
apt get clean
添加到了我的dockerfile中,它似乎已经完成了操作


我想我没有办法知道是不是额外的命令或者是运气修复了我的构建,但是对于那些遇到类似问题的访问者,我听取了的建议,使用
docker构建中的
--no cache
标志可能会有所帮助。如果apt get update很旧并且没有被调用到缓存,则可能会发生类似的问题(尽管不是这个问题)

对于任何对此有问题的人,无论何时构建Dockerfile,我都会尝试通过将
httpredir
替换为单个工作域来“修复”该问题:

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...

声誉不足,无法对以前的答案发表评论,因此我将(令人困惑地)添加一个新答案:

  • 我不认为对单个镜像进行硬编码是一个切实可行的解决方案,因为正如我们所看到的,debian实现整个HttpEditor是有原因的——镜像失效或过时
  • 我已经多次处理过这个问题,而且日志总是表明docker实际上正在运行apt get命令,这意味着——没有缓存不太可能修复它——只是如果重建,httpredir可能会选择不同的镜像,即使您不更改docker文件中的任何内容,而且构建也会工作

是的,你是对的,我上周能够一致地重现这个问题,甚至是在几天内,但是上面的代码现在可以无缝地工作了。我已经成功运行了两次以上的MWE。我想这突出了docker的可复制性水平的不幸缺点和局限性。这是我找到的唯一一个在Dockerfile(或其他在每个返回代码上都失败的脚本)中使用的解决方案。我在一些地方看到的apt-get-clean建议并没有可靠地发挥作用。哈哈,那些缓存清除了,还有一些东西也不总是让我失望。这是它以近乎完美的方式工作的唯一快捷和肮脏的方式。虽然有时速度很慢,但我一直在docker中的rails构建中遇到这个问题。上面解决了这个问题,没有缓存帮我解决了这个问题。非常感谢你!在他们提出解决方案之前,我认为还没有解决方案。我的解决方案不是硬编码单个源代码,而是帮助您选择一个已启动并正在运行的源代码,并在特定的构建会话中一直坚持到它结束。
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...
RUN sed -i "s/httpredir.debian.org/mirrors.tuna.tsinghua.edu.cn/" /etc/apt/sources.list