在CentOS 7安装docker-ce时,moby软件包出现问题

3

我有一个 CentOS 7 的 Docker 镜像,使用推荐指南安装 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
4个回答

6

你说得对。我在别处找到了这个答案,并为完整性更新了我的回答。 - Bruce Adams
其实我的答案在技术上是错误的,所以即使我的现在更好,我也必须接受你的答案 :) - Bruce Adams

2

用户8475213的答案对我起作用了。但是在运行这些命令后,我还需要执行以下步骤:

yum clean metadata

你或许应该解释一下为什么这个步骤对你有效。这样可以帮助原帖的作者更好地理解为什么这个答案是有意义的。 - Jay
我也不得不跟着user8475213的答案做这个,它的作用是清除yum缓存,很可能是由于最初的yum update命令导致了第一次出现moby-containerd conflicts with containerd.io错误。 - 0xKate

1
警示:通常免责声明适用。这只是我的想法,我可能错了。如果有需要,请评论/建议编辑。 如何修复它? 实际上,这是一个与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 表明使用的构建过程存在问题。这个包应该只对测试人员可用,而不是在标记为“稳定”的存储库中提供。

如何避免类似的问题在未来发生?

与流行的神话相反,使用 docker 并不能完全隔离您免受环境变化的影响。您的 docker 文件使用的存储库本身就是环境的一部分。如果环境发生变化,就像这种情况一样,那么您可重复生成的构建可能无法再次生成。唯一真正避免这种情况的方法是托管自己的存储库,但这需要付出高昂的代价。通常外部存储库足够稳定,因此这不是一个问题。

您应该考虑在 dockerfile 中指定要安装的特定软件包版本,以避免意外升级。然而,在像这样的情况下,其中一个软件包被淘汰并替换时,这将无法帮助您。


0

RHEL 8 相关问题

看起来 Azure 依赖于 container-tools 模块中的软件包,而 Docker 与这些软件包存在冲突。

# dnf remove @container-tools

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接