• 首页 > 
  • Alibaba Cloud Linux 3系统中使用docker-ce、epel等第三方DNF(YUM)源安装软件失败

Alibaba Cloud Linux 3系统中使用docker-ce、epel等第三方DNF(YUM)源安装软件失败

KB: 257767

 · 

更新时间:2021-06-22 11:18

问题描述

在符合如下条件的Alibaba Cloud Linux 3实例中,使用适配CentOS 8中的第三方DNF(YUM)源,执行dnf install docker-ce命令安装容器软件包失败,并出现如下报错。

  • aliyun_3_x64_20G_alibase_20210425.vhd及之前的所有镜像版本。
Docker CE Stable - x86_64
Failed to download metadata for repo 'docker-ce-stable'
Error: Failed to download metadata for repo 'docker-ce-stable'

问题原因

第三方DNF源仅适配CentOS 8发行版,而在Alibaba Cloud Linux 3中,系统的releasever值与CentOS 8不同,导致DNF解析后的地址无效,从而下载RPM包失败。DNF安装docker-ce时,首先会从系统中获取版本号,即releasever值,然后替换掉相应源baseurl中对应的$releasever变量,之后DNF从替换后的baseurl中获取相关数据。由于CentOS 8的releasever值为8,而Alibaba Cloud Linux 3系统的releasever值为3,因此解析后的baseurl并非预期地址,DNF便无法从这个错误的地址中安装软件包。

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

本文以docker-ce源为例进行介绍,如果您使用的是其他DNF源,解决方法类似。

临时解决方法

  1. 登录问题实例,编辑/etc/yum.repos.d/docker-ce.repo文件,找到docker-ce.repo文件中所有存在enabled=1值的源,将源中baseurl的$releasever变量替换为8。
  2. 保存并退出,重新进行安装即可。

根本解决方案

通过安装dnf-plugin-releasever-adapter插件实现releasever的自动转换,即将3转换为8。dnf-plugin-releasever-adapter插件目前的版本及默认支持的第三方repo如下表所示:

插件版本 默认支持的第三方repo 插件的限制
1.0-1.3 docker-ce.repo,epel.repo

您需要满足以下条件,才可以使用该插件:

  • 操作系统需要是Alibaba Cloud Linux 3。
  • 执行以下命令,确认系统中存在alinux3-plus的repo。
    cat /etc/yum.repos.d/AliYun.repo |grep -A3 alinux3-plus
    系统显示类似如下,说明存在alinux3-plus的repo。
  1. 在Alibaba Cloud Linux 3系统上执行以下命令,安装插件。目前,插件默认对docker-ce和epel源中的$releasever值做自动转换。
    dnf install dnf-plugin-releasever-adapter --repo alinux3-plus
  2. 若无其他的DNF源需要转换,安装插件后即可直接安装软件;若还有其他的DNF源需要转换,请按照以下方式配置:
    1. 依次执行以下命令,进入/etc/yum/pluginconf.d/目录,编辑releasever-adapter.conf配置文件。如果需要添加其他的DNF源,则需要将DNF源的.repo文件名添加在include字段后面,并以逗号隔开。
      说明:DNF源的.repo文件一般在 /etc/yum.repos.d/目录下查看。
      cd /etc/yum/pluginconf.d/
      vim releasever-adapter.conf
      系统显示类似如下。
      [main]
      enabled=1

      [releasevermapping]
      release_dict={'2.1903' : '7', '3' : '8'}

      [reposlist]
      include=docker-ce.repo, epel.repo
      说明
      • 文件中参数的具体介绍如下所示:
        • [main]:此部分为插件的主要控制部分,控制插件的启用与否,其中enabled=1表示启用插件,enabled=0表示停用插件。
        • [releasevermapping]:此部分为待处理的releasever的映射关系,其中2.1903映射为7,3映射为8。
        • [repolist]:此部分为需要修改的源的列表,如果需要添加其他的源,则需要将.repo文件的名字添加在include字段后面,并以逗号隔开。
      • 一般来说,一个.repo文件中有多个可以使用的源,每个源都有一个独立的名称区分其他的源,一个系统中不能出现重复的名称,例如:docker-ce.repo中有[docker-ce-stable]和[docker-ce-stable-debuginfo]等源。
      • 请务必保证新添加到releasever-adapter.conf配置文件中的源文件名字是源文件内各个源名称的前缀,例如:docker-ce.repo源文件中包含的docker-ce-stable和docker-ce-stable-debuginfo两个源名称,均以docker-ce 为前缀。
    2. 保存配置文件,即可通过docker-ce、epel和您添加的源安装docker-ce软件,命令如下所示。
      说明:您也可以尝试安装其他软件。
      dnf install docker-ce

适用于

  • 云服务器ECS