macos - 适用于 Mac 的 Docker - 哈希和不匹配

标签 macos ubuntu docker

我正在使用 Docker for Mac 和这样的 Dockerfile(才刚刚开始):

# Base image
FROM ubuntu:16.04

RUN export DEBIAN_FRONTEND=noninteractive

# Update packages list and system
RUN apt-get -y update;
RUN apt-get -y upgrade

# Allow to use add-apt-repository command
RUN apt-get -y install software-properties-common locales poppler-utils

几天后我收到这样的错误:

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/k/krb5/libk5crypto3_1.13.2+dfsg-5ubuntu2_amd64.deb  Hash Sum mismatch

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/k/keyutils/libkeyutils1_1.5.9-8ubuntu1_amd64.deb  Hash Sum mismatch

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/k/krb5/libkrb5-3_1.13.2+dfsg-5ubuntu2_amd64.deb  Hash Sum mismatch

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/k/krb5/libgssapi-krb5-2_1.13.2+dfsg-5ubuntu2_amd64.deb  Writing more data than expected (206672 > 201874) [IP: 91.189.88.152 80]

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

ERROR: Service 'web' failed to build: The command '/bin/sh -c apt-get -y install software-properties-common locales poppler-utils' returned a non-zero code: 100

以前我在 Windows 上使用 Docker 并且在 2 年内可能会出现 1 或 2 次这样的错误,而现在在 Mac 上我总是遇到这些错误并且无法构建我的图像。

这可能是什么原因?我应该在我的 Mac 上做些什么,还是应该更改我的 Dockerfile 中的一些东西以使其工作?

请注意,我也在玩这样的更改:

# Base image
FROM ubuntu:16.04

RUN export DEBIAN_FRONTEND=noninteractive

RUN echo 'Acquire::Acquire-by-hash "yes";' >> /etc/apt/apt.conf
RUN echo 'Acquire::CompressionTypes::Order "gz";' >> /etc/apt/apt.conf

# Update packages list and system
RUN apt-get -y update
RUN apt-get -y clean
RUN apt-get -y upgrade
RUN apt-get -y clean
RUN apt-get dist-upgrade

# Allow to use add-apt-repository command
RUN apt-get -y install software-properties-common locales poppler-utils

# Base image
FROM ubuntu:16.04

RUN export DEBIAN_FRONTEND=noninteractive

RUN rm -rf /var/lib/apt/lists/partial
RUN echo 'Acquire::By-Hash "yes";' >> /etc/apt/apt.conf
RUN echo 'Acquire::CompressionTypes::Order:: "gz";' >> /etc/apt/apt.conf

# Update packages list and system
RUN apt-get update && apt-get install -y --no-install-recommends apt-utils
RUN apt-get -y clean
RUN apt-get -y upgrade
RUN apt-get -y clean
RUN apt-get dist-upgrade

# Allow to use add-apt-repository command
RUN apt-get -y install software-properties-common
RUN apt-get -y install locales poppler-utils

但这并没有改变这一点。

我已经在 Windows 上对其进行了测试,它运行得非常好。有趣的是,当我在 MacOS 上将 FROM ubuntu:16.04 更改为 FROM ubuntu:17.10 时,它也可以正常工作,所以似乎包不是从16.04 但 17.10 当我有 FROM ubuntu:16.04

我已经:

  • 重新启动我的 Mac
  • 重新启动 Docker
  • 删除所有数据
  • 恢复出厂设置
  • 卸载并重新安装 Docker
  • 从 mac49 降级到 17.12.0-ce-mac46 (21698)
  • 删除所有图像/容器并重新构建它们

这些都没有改变事情。奇怪的是它以前在我的 MacOS 上工作过(我之前构建图像大约 20-30 次而且很好)而且现在也许每 100 次一次它现在可以成功构建图像但显然这不是最好的解决方案.

作为临时解决方法,我在 Windows 上构建了所​​有镜像并将它们推送到 Docker hub,然后将它们拉到 MacOS 上,但这同样只是解决方法,而不是解决方案。

最佳答案

我的感觉是您遇到了一个已知问题 Ubuntu bug #972077我也遇到过。

显然,更新镜像时,apt 存储库格式会受到竞争条件的影响。此问题特别影响快速更改的存储库,例如开发版本并与 16.04 和 17.10 之间的症状描述一致。

对我有用的推荐解决方案是运行:

apt-get clean
rm -r /var/lib/apt/lists/*
# The blog below also recommends to change your compression
apt-get update -o Acquire::CompressionTypes::Order::=gz 

注意:这似乎与您从中提取的缓存混淆了。因此在某些情况下,您似乎需要更改下载存储库以更新缓存。

引用资料:

Package Cloud 博文:

关于此问题的 Ubuntu 线程:

关于这个问题的 Unix 线程

我希望以上内容能帮助您指明正确的方向。

关于macos - 适用于 Mac 的 Docker - 哈希和不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645936/

相关文章:

git - 在 Github-Dockerhub 上自动构建的 Docker 工作流程

python - 从 docker 运行 python web 应用程序

python - IO错误 : [Errno 22] Invalid argument when reading/writing large bytestring

node.js - Docker容器在主机上生成Docker容器

c++ - QT项目无法编译,没有可用于构建的编译器

java - 如何在ubuntu中从java程序运行c可执行文件

ubuntu - Ubuntu上的Jenkins,在Windows机器上触发exe文件

python - 是否可以在 python 中接收 GCM 消息

macos - 从 OS X 命令行调用的 ctags 不正确

android - 如何在 OSX for Android studio 中设置 NDK 构建路径