错误:无法下载“appstream”存储库的元数据:无法准备内部镜像列表:镜像列表中没有URL。

95

我正在尝试在Dockerfile中指定的CentOS上使用yum下载Java。在拉取CentOS镜像后,运行程序崩溃并抛出了这个错误!

还要提到我的服务器实例是AWS EC2!

Step 2/9 : RUN yum install java -y
 ---> Running in 39fc233aa965
CentOS Linux 8 - AppStream                      184  B/s |  38  B     00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum install java -y' returned a non-zero code: 1

这个回答解决了你的问题吗?通过VM安装Centos-镜像列表中没有URL。下面的得票最高的答案表明,这个(现在已关闭的)问题包含了对这个问题的回答。 - Jeremy Caney
11个回答

162

尝试编辑您的Dockerfile

FROM centos

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

RUN yum -y install java

CMD /bin/bash

请参考以下代码

failed-metadata-repo-appstream-centos-8


4
太棒了!这解决了我的问题。知道CentOS有维护其旧版本的仓库真是太好了。 - Valentino Pereira
该链接解决了我的问题。我没有使用 Docker。 - Carl Marcum
1
这个链接对我有用!非常感谢您节省了我的时间 :) - Rajdeep Borgohain
在WSL上,Dockerfile基于Centos的镜像同样适用。 - Kamila Nowak
1
你不需要使用 cd 命令。即使存在,也不影响任何事情,因为当执行下一个 RUN 命令时,会创建一个新的“层”,而 cd 命令所做的任何操作都将被清除。 - Samarth S

74

如果您还没有,您将需要gpg密钥:

wget 'http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-3.el8.noarch.rpm'
sudo rpm -i 'centos-gpg-keys-8-3.el8.noarch.rpm'

然后,只需像这样进行过渡:

dnf --disablerepo '*' --enablerepo=extras swap centos-linux-repos centos-stream-repos

别担心,它不会删除任何存储库,只是暂时忽略您的所有存储库,并下载有关新镜像的信息。

此时,您可能想要实际升级软件包:

sudo dnf distro-sync

现在您可以像往常一样使用“yum”了。


在进行“distro-sync”之前,首先必须从“PowerTools”存储库中删除所有重复的软件包。现在,一些“mirror.centos.org”似乎已经成为“vault.centos.org”(存档)。 - Martin Zeitler
很不幸,在尝试将wget下载到基本的CentOS-8镜像时,我遇到了这个错误。@BigCat的建议对我有用。 - Kevin Mooney

68

前往/etc/yum.repos.d/

cd /etc/yum.repos.d/

运行

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

那就做你想做的事情吧。


2
请参考以下内容,这是有关编程的英文原文,已经被翻译成中文:在Python中,您可以使用os.path.join()函数来连接路径。例如,如果您有两个字符串path1path2,您可以使用以下代码将它们连接起来:import os path1 = "/path/to/directory" path2 = "filename.txt" full_path = os.path.join(path1, path2) print(full_path)这将输出/path/to/directory/filename.txt - miken32
2
在WSL2中导入Docker镜像(Centos)的唯一真正有帮助的答案。 - Goujon
很好。这应该是大多数人的答案。(不使用Docker。) - Khom Nazid
1
这个答案是我一个月前写的回答中提取的!!! stackoverflow.com/a/71586270 - Daniel Andrzejewski
使用'^'确保'#'只添加一次,并且只在行的开头添加: sudo sed -i 's/^mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* - undefined

19

CentOS 8已于2021年12月31日到达生命周期结束(公告)。

因此,镜像的URL不再起作用。官方建议不要使用sed来修改URL以指向存档镜像,而是通过以下方式将CentOS Linux 8转换为CentOS Stream 8:(官方推荐)

dnf --disablerepo '*' --enablerepo extras swap centos-linux-repos centos-stream-repos
dnf distro-sync

之后,dnf/yum 将会再次有效。


更好的例子请 - user1034912
1
这不只是一个示例,按原样执行命令。如果你不是root用户,请在命令前加上“sudo”。如果你需要它们在Docker文件中,请在命令前加上“RUN”。 - stackprotector

17

我尝试在WSL中使用CentOS 8,但遇到了相同的错误。以下是解决问题的步骤(以root身份):

我尝试在WSL中使用CentOS 8,但遇到了相同的错误。以下是解决问题的步骤(以root身份):

# 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-*
# dnf distro-sync
# dnf -y install java

最高票答案对我不起作用(作者为@Hashbrown)。使用Dockerfile的答案也不适用于我的情况。


我认为“dnf distro-sync”将撤销前两个sed命令所做的更改。 - user1754036
dnf不会更改其在/ etc下的配置。请查看man dnf。它只会升级、降级或保留已安装的选定软件包以匹配任何启用存储库中可用的最新版本。 - Daniel Andrzejewski
1
然而,在“dnf distro-sync”完成运行后,输入 grep "baseurl=http://mirror.centos.org" /etc/yum.repos.d/CentOS-* 显示的是在第二个sed命令之前所显示的内容。 如果我们跳过“dnf distro-sync”命令,Java将会安装。 - user1754036
这是由dnf distro-sync生成的完整输出: https://pastebin.com/mMZkkbCL 请注意从第1476行开始对/etc所做的更改。 - user1754036
使用'^'确保'#'只添加一次,并且只在行的开头添加: sudo sed -i 's/^mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* - undefined

14

使用这些命令在 AWS EC2 上更新 CentOS 8.0:

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

3

试一试

从CentOS开始

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

RUN yum -y install java

CMD /bin/bash

0

请使用以下内容更新您的Docker文件。应该可以正常工作。

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

0

请按照以下步骤操作:

  1. 进入 /etc/yum.repos.d/ 目录。

    cd /etc/yum.repos.d/

  2. 运行以下命令,对所有 yum.repos.d 文件中的镜像列表进行哈希处理,然后将现有的 Baseurl 替换为 vault.centos.org

    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-*

  3. 然后运行 yum update 或安装任何您想要的软件包

    yum update -y


0
我的解决方案必须是其他答案的混合体。我使用了最新的CentOS(截至几天前)和Docker默认镜像。(由于我已经是root用户,所以sudo命令失败了)
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-*
yum install PACKAGE

无需更新yum。

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