在 CentOS 7 上安装 docker-ce 时出现 moby 包问题

Problem with moby packages when installing docker-ce on CentOS 7

我有一个 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 的使用。我有以下内容,因为需要 aspnetcore 才能在 Azure devops 管道中发布包:

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

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

我该如何解决?

这实际上是 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-\*

为什么会这样?

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

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

如何防止以后出现类似问题?

与流行的神话相反,使用 docker 并不能使您完全不受环境变化的影响。 docker 文件使用的存储库本身就是环境的一部分。如果环境发生变化,就像在这种情况下一样,那么您的可重现构建可能不再是可重现的。避免这种情况的唯一真正方法是以高价托管您自己的存储库。通常外部存储库足够稳定,这不是问题。

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

我的存储库需要更新 --- 以下解决了我的问题:

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

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

yum clean metadata

RHEL 8 中的相关问题

似乎 azure 依赖于 container-tools 模块中的包,并且 Docker 与这些包冲突。

# dnf remove @container-tools