Docker(7)Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist

问题描述

 Docker(6)这一小节中的“1.2.1 RUN和CMD的区别”这一部分,在编辑dockerfile2文件后,执行docker build命令,始终在yum -y install vim这一步无法通过,且会报错。错误信息如下截图:

①Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

报错的意思是:从仓库 ‘appstream’ 下载元数据失败:由于镜像列表中没有 URL,不能准备内部镜像列表。

② ERROR: failed to solve: process "/bin/sh -c yum -y install vim" did not complete successfully: exit code: 1

dockerfile2的路径信息/data/dockerfile_test_volume,文件内容为:

FROM centos
MAINTAINER eufeo/hyxy016@16.com

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----echo----"
CMD /bin/bash

参数说明:

  • FROM centos:指定基础镜像为 CentOS。
  • MAINTAINER:指定镜像的维护者和联系方式。
  • ENV MYPATH /usr/local:定义一个环境变量 MYPATH,并设置其值为 /usr/local
  • WORKDIR $MYPATH:将工作目录切换到 $MYPATH,即 /usr/local
  • RUN yum -y install vim:在容器内运行命令,安装 Vim 编辑器。
  • RUN yum -y install net-tools:在容器内运行命令,安装 net-tools,包括常用的网络工具。
  • EXPOSE 80:声明容器将监听的端口号为 80,但这并不会自动映射到主机端口。
  • CMD echo $MYPATH:在容器启动时运行的命令,输出环境变量 $MYPATH 的值。
  • CMD echo "----echo----":在容器启动时运行的命令,输出固定的字符串 "----echo----"。
  • CMD /bin/bash:在容器启动时运行的命令,启动一个交互式的 Bash 终端。

问题分析 

✨ 第一种可能的情况便是网络连接问题。检查是否可以连接外部网络,可以使用 ping baidu.com 查看是否有丢包情况。如果丢包,则进一步检查网络连接是否正常;如果没有丢包,继续阅读下文
✨ 那么第二种情况,便是 CentOS 已经停止维护的问题。2020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org。

问题解决

那么针对上面提到的第二种情况,给出的解决方法如下:

①查看已有镜像的列表

docker images

 ②选择要修改的镜像,并创建一个临时容器

docker run -it --name centos_plus centos bash

参数说明:创建一个名为 centos_plus 的容器,基于 CentOS 镜像,并使用交互式 Bash 终端 

③查看centos的版本

[root@8979d03e07fd /]# ls     
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@8979d03e07fd /]# cd /etc/
[root@8979d03e07fd etc]# cat os-release 
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"

可以看出来centos的版本为centos:8,此时可以确定,确实是centos镜像的问题。

④ 进入到 yum 的 repos 目录

cd /etc/yum.repos.d/

 ⑤修改 centos 文件内容

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

 参数说明:实现对 CentOS YUM 仓库配置文件中的 mirrorlist 和 baseurl 进行修改。修改后的配置将在下次使用 YUM 命令时生效,指向新的仓库地址。

⑥生成缓存更新(第一次更新,速度稍微有点慢,耐心等待两分钟左右)

yum makecache

⑦运行 yum update 并重新安装 vim (第一次更新,速度稍微有点慢,耐心等待两分钟左右)

yum update -y
yum -y install vim

⑧修改临时容器成功后,按住ctrl+p+q退出容器,提交容器的修改为新的镜像 centos:8.0_plus

docker commit centos_plus centos:8.0_plus

⑨删除临时容器centos_plus

docker rm -f centos_plus

⑩修改dockerfile2文件的第一行:FROM centos为FROM centos:8.0_plus,重新docker build

docker build -f /data/dockerfile_test_volume/dockerfile2 -t eufeo/centos:2.0 .

至此,完美解决,Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist。

 参考

 解决Docker:最新版本镜像centos,yum出现问题 - 知乎 (zhihu.com)

【已解决】Error: Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist_ReadThroughLife的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值