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,并直接修改原始文件。