【问题标题】:Problem with moby packages when installing docker-ce on CentOS 7在 CentOS 7 上安装 docker-ce 时出现 moby 包的问题
【发布时间】:2020-11-19 15:34:49
【问题描述】:

我有一个 CentOS 7 的 docker 映像,它通过 recommended instructions 安装 docker-ce。 即

RUN yum-config-manager \
  --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
RUN yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
RUN yum update -y
RUN yum install -y docker-ce docker-ce-cli containerd.io

最近这停止工作,现在失败如下:

--> Processing Conflict: moby-containerd-1.3.6+azure-1.x86_64 conflicts containerd
--> Processing Conflict: moby-runc-1.0.0~rc10+azure-2.x86_64 conflicts runc
--> Finished Dependency Resolution
Error: moby-containerd conflicts with containerd.io-1.2.13-3.2.el7.x86_64
Error: moby-runc conflicts with containerd.io-1.2.13-3.2.el7.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
The command '/bin/sh -c yum install -y docker-ce docker-ce-cli containerd.io' returned a non-zero code: 1

如果安装命令被替换为:

yum install -y docker

我得到一个与未签名包有关的不同错误:

Package runc is obsoleted by moby-runc, trying to install moby-runc-1.0.0~rc10+azure-2.x86_64 instead
...
Package moby-runc-1.0.0~rc10+azure-2.x86_64.rpm is not signed

我尝试强制使用以下几个旧版本,但无济于事,例如

RUN yum install -y docker-1.13.1-102.git7f2769b.el7.centos

为什么会这样?我该如何解决?以及如何防止将来出现类似问题?


更新:此问题中缺少的一个关键信息是 Azure 的使用。我有以下内容,因为在 Azure devops 管道中发布包需要 aspnetcore:

RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
RUN yum update -y && yum install aspnetcore-runtime-3.1 -y

【问题讨论】:

    标签: azure docker centos7 moby


    【解决方案1】:

    我的 repo 需要更新 --- 以下解决了我:

    curl https://packages.microsoft.com/config/rhel/7/prod.repo > ./microsoft-prod.repo
    sudo cp ./microsoft-prod.repo /etc/yum.repos.d/
    yum update -y
    

    https://docs.microsoft.com/en-us/windows-server/administration/linux-package-repository-for-microsoft-software

    【讨论】:

    • 你是对的。我在其他地方找到了这个并更新了我的完整答案。
    • 实际上我的回答在技术上是错误的,所以我必须接受你的回答,即使我的现在更好:)
    【解决方案2】:

    user8475213 的回答对我有用。但我也必须在这些命令之后运行:

    yum clean metadata
    

    【讨论】:

    • 您或许应该添加说明为什么此步骤对您有效。在帮助原始海报方面大有帮助,为什么这个答案是有道理的。
    • 我还必须与 user8475213 的回答一起执行此操作,它的作用是清除 yum 缓存,该缓存可能被最初的yum update 命令污染,导致第一个moby-containerd conflicts with containerd.io 错误地点。
    【解决方案3】:

    警告:通常免责声明适用。这只是我的想法,我可能记错了。如果有,请发表评论/建议修改。

    我该如何解决?

    这实际上是 repo 的 baseurl 而不是 docker-ce repo 的问题(尽管我最初确实在那里提交了错误报告(请参阅问题 #11198)。

    moby 包来自“packages-microsoft-com-prod”。 看来baseurl已经改变了。 现在正确的是:

    baseurl=https://packages.microsoft.com/rhel/7/prod/
    

    通过以下方式安装:

    RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo >/etc/yum.repos.d/microsoft-prod.repo
    

    带有狡猾包裹的是:

    baseurl=https://packages.microsoft.com/centos/7/prod/
    

    通过以下方式安装:

    RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    

    moby 软件包仅存在于可能已失效的 CentOS 存储库中,因为 Microsoft 自己已在各个地方更改了安装文档。

    还有一个解决方法。您可以排除“moby”包,直到它们真正准备好,如下所示:

    RUN yum install -y docker --exclude=moby-\*
    

    为什么会这样?

    我认为这是由于过度积极地推广 moby 替代 docker-ce 功能造成的。 在他们解决问题时,希望这是一个短暂的状态。

    moby-runc-1.0.0~rc10+azure-2.x86_64.rpm 未签名表明所使用的构建过程存在问题。这个包应该只对 beta 测试人员可用。当然不在标记为“稳定”的存储库中。

    我怎样才能防止将来出现类似问题?

    与流行的神话相反,使用 docker 并不能完全将您与环境的变化隔离开来。 docker 文件使用的存储库本身就是环境的一部分。如果该环境发生变化,如本例所示,那么您的可重现构建可能不再是可重现的。避免这种情况的唯一真正方法是托管您自己的存储库,但价格很高。通常外部存储库足够稳定,这不是问题。

    您应该考虑在 dockerfile 中指定要安装的特定版本的软件包,以避免意外升级。但是,在这样的包被废弃和替换的情况下,这对您没有帮助。

    【讨论】:

      【解决方案4】:

      RHEL 8 中的相关问题

      好像 azure 依赖于来自 container-tools 模块的包,而 Docker 与这些包冲突。

      # dnf remove @container-tools
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-02
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-18
        • 2023-03-22
        相关资源
        最近更新 更多