【问题标题】:Yum update fails -Centos 7 - dockerbuildYum 更新失败 -Centos 7 - dockerbuild
【发布时间】:2018-09-21 14:44:47
【问题描述】:

我经常使用 centos 7 作为基础镜像构建 docker 容器。但是现在我在运行时遇到错误,

RUN yum update add \
    bash \
    && rm -rfv /var/cache/apk/*

ERROR:
Loaded plugins: fastestmirror, ovl

其中一个配置的存储库失败(未知), 并且 yum 没有足够的缓存数据来继续。此时唯一 百胜可以做的安全的事情是失败。有几种方法可以“解决”这个问题:

  1. 联系存储库的上游并让他们解决问题。

  2. 重新配置 baseurl/等。对于存储库,指向一个工作 上游。如果您使用的是较新的,这通常很有用 分发版本比存储库支持的版本(和 以前发行版的软件包仍然有效)。

  3. 在暂时禁用存储库的情况下运行命令 yum --disablerepo=<repoid> ...

  4. 永久禁用存储库,因此 yum 默认不会使用它。百胜 然后将忽略存储库,直到您永久启用它 再次或使用--enablerepo 临时使用:

    yum-config-manager --disable <repoid>
    

    `subscription-manager repos --disable=<repoid>`
    
  5. 配置要跳过的失败存储库,如果它不可用。 请注意,yum 将尝试联系 repo。当它运行大多数命令时, 所以每次都必须尝试失败(因此。百胜会很多 慢点)。如果这是一个非常暂时的问题,这通常是一个很好的 妥协:

    yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
    

无法为 repo 找到有效的 baseurl:base/7/x86_64 无法检索 镜像列表 http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=container 错误为 14:curl#6 - “无法解析主机:mirrorlist.centos.org; 名称或服务未知” 命令 '/bin/sh -c yum update add
bash && rm -rfv /var/cache/apk/*' 返回一个非零代码:1

我也看到了一些使用“dhclient”的解决方案,但是当我执行 docker-compose build 时会发生此错误。

【问题讨论】:

  • yum 是否正常工作或给出关于base 存储库的相同错误?例如,如果您执行 yum install &lt;foo&gt;yum update &lt;foo&gt;
  • 当我执行 yum install 时出现同样的错误
  • 听起来像 base 存储库已损坏或丢失。看看我的回答 here 可能会解决这部分问题。

标签: docker docker-compose centos7 yum


【解决方案1】:

我的假设是,由于某种原因,docker 中的网络行为因分布而异。

尝试使用:

docker run -d --net mybridge centos

docker network create -d bridge mybridge
docker run -d --net mybridge centos

它应该开始工作了。或者直接编辑/etc/hosts并添加镜像地址

Name:    mirrorlist.centos.org
Address: 67.219.148.138 

【讨论】:

  • 同意。根据我的经验,确实似乎是发行版之间的差异,或者至少是操作系统之间的差异。在 macOS 上,使用主机的网络接口从运行在 Docker 容器中的进程与 Internet 主机通信不需要额外的配置。一开始有点令人费解,但我认为我更喜欢必须手动建立到主机界面的桥接,而不是在 Mac 上看似不安全的默认配置。
【解决方案2】:

问题的根本原因是容器代理设置错误。刚刚更正了以下位置的代理设置并正常工作。

/root/.docker/config.json

【讨论】:

    【解决方案3】:

    我在尝试运行相同的Dockerfile 时遇到了这个问题,它使用yum 在两个不同的平台上获取了几个软件包;一个 macOS,另一个是基于 Ubuntu 16.04 的 Linux 操作系统(elementaryOS Loki),两者都使用来自 docker.com 的官方软件包。

    我的理论是,Linux 软件包在安全方面比 macOS 软件包更具限制性。也许这可以通过某种/etc/something 配置文件进行配置,但我没有 Docker 方面的专业知识可以肯定地说。 编辑:请参阅下面的评论。

    可以说的是我在 macOS (10.11 El Capitan) 上不需要额外的配置;只是 docker build . 工作正常,来自 Dockerfileyum 进程能够访问所有远程存储库。

    然而,在 Ubuntu 派生的 Linux 发行版中,有必要使用

    docker build --network host .
    

    紧随其后

    docker run -it --network host <image> <command>
    

    当我想在该图像中运行需要互联网访问的进程时。

    其他 Debian 衍生系统也可能是这种情况。

    当然,当允许长时间运行的 Docker 容器不受限制地通过主机网络适配器进行通信时,需要考虑安全因素,在这方面最好查看the appropriate documentation

    【讨论】:

    • 一个潜在的长期解决方案,对于每个 docker 命令行都需要 --network host,在官方 Docker 文档中的“安装后步骤”下提到对于 Linux”:禁用 NetworkManager 的 dnsmasq 集成,如 here 所述(另请参见 this SU thread)。如果您的主机操作系统是 LAN 上多个用户的服务器,这可能不是最佳选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2021-10-24
    • 2020-07-03
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多