Alpine Linux apk add DNS lookup error

起因

最近做了需要做几个基础镜像,Dockerfile 来自 Github 某仓库,镜像使用的是 Alpine Linux 3.18,且这个镜像已经更改过软件包管理器 apk 所使用的软件包仓库(记住这句话),后面基于这个镜像我还需要额外加了一些其他软件包,Dockerfile 大致如下

FROM 某个第三方镜像:alpine-3.18

......

RUN apk add --no-cache --update 其他软件包

......

然后执行之后报错了

0.204 fetch http://mirrors.cloud.aliyuncs.com/alpine/v3.18/main/x86_64/APKINDEX.tar.gz                                                                                                                                                           
0.213 WARNING: fetching http://mirrors.cloud.aliyuncs.com/alpine/v3.18/main: DNS lookup error                                                                                                                                                    
0.213 fetch http://mirrors.cloud.aliyuncs.com/alpine/v3.18/community/x86_64/APKINDEX.tar.gz                                                                                                                                                      
0.219 WARNING: fetching http://mirrors.cloud.aliyuncs.com/alpine/v3.18/community: DNS lookup error     

 

经过

起初我看到这个 DNS 错误本以为是某个域名被那啥了,后面看到是阿里云的镜像地址,越想越不对劲,还以为是阿里云调整了新的地址导致的,后面再试了几次依旧无法成功,尝试 ping 下这个域名

ping mirrors.cloud.aliyuncs.com

正在 Ping mirrors.cloud.aliyuncs.com [100.100.2.148] 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。

100.100.2.148 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失),

基本上可以确定是这个地址有问题了,后面尝试在阿里云搜了一下有关这个接口的资料,发现一个 阿里云镜像网站 

 

 

在里面找到 Alpine Linux,在右边瞄到这段话

 

 

好家伙,原本是配置了阿里云的 VPC 地址,难怪本地访问不了。到这里基本上已经找到答案了

顺便看下 Linux Alpine 的软件仓库配置,也就是 /etc/apk/repositories 文件。

/etc/apk/repositories 文件是 Alpine Linux 中用于存储软件包仓库信息的配置文件。在 Alpine Linux 中,apk 是用于管理软件包的命令行工具,类似于其他 Linux 发行版中的 apt(Debian/Ubuntu)或 yum(CentOS/RHEL)。

该文件包含了软件包管理器 apk 可以使用的仓库源的信息,包括仓库的URL、版本和描述信息等。通过编辑这个文件,你可以添加、删除或修改 Alpine Linux 系统中使用的软件包仓库。

一个典型的 /etc/apk/repositories 文件的内容可能如下所示:

http://dl-cdn.alpinelinux.org/alpine/v3.14/main
http://dl-cdn.alpinelinux.org/alpine/v3.14/community

这个文件中列出的URL指向 Alpine Linux 软件包仓库,main 仓库包含了 Alpine Linux 官方维护的软件包,而 community 仓库则包含了由社区维护的软件包。

通过编辑这个文件,你可以更改软件包管理器 apk 所使用的软件包仓库,例如,你可以添加第三方或定制的软件包仓库,以获取额外的软件包或特定版本的软件包。

请注意,修改这个文件可能会影响系统中软件包的可用性和更新方式,因此在进行修改之前,请务必谨慎考虑,并确保了解修改可能产生的影响。

 

结果

直接调整软件仓库配置地址,有两种方法,原理都是一样的

方案一、直接修改配置文件

编辑 /etc/apk/repositories
将里面 mirrors.cloud.aliyuncs.com 的 改成 mirrors.aliyun.com ; 保存退出即可

方案二、使用 sed 批量替换

sed -i "s|mirrors.cloud.aliyuncs.com|mirrors.aliyun.com|g" /etc/apk/repositories


# 说明
这个命令使用 sed 对 /etc/apk/repositories 文件进行编辑,并将其中所有的 mirrors.cloud.aliyuncs.com 替换为 mirrors.aliyun.com。

让我们来分解这个命令:

sed:是用于流编辑的命令行工具。
-i:是 sed 命令的一个选项,表示直接在文件中进行编辑,而不是将结果输出到标准输出。在这个命令中,-i 选项后面没有指定备份文件的扩展名,因此 sed 会直接修改原始文件,而不会创建备份文件。
"s|mirrors.cloud.aliyuncs.com|mirrors.aliyun.com|g":是 sed 的编辑命令,它使用了 s 命令来执行替换操作。其中,| 是分隔符,用于分隔命令中的各个部分。在这个命令中,mirrors.cloud.aliyuncs.com 是要被替换的文本,mirrors.aliyun.com 是要替换成的文本,g 表示全局替换,即每行中所有匹配的文本都会被替换。
/etc/apk/repositories:是要被编辑的文件路径。
因此,这个命令的作用是在 /etc/apk/repositories 文件中,将所有的 mirrors.cloud.aliyuncs.com 替换为 mirrors.aliyun.com,并直接修改原始文件。

 

posted @ 2024-06-01 10:12  凌雨尘  阅读(174)  评论(0编辑  收藏  举报