2020年11月30日,CentOS 6到达了EOL(End of Lifetime)日期,yum官方源随即被归档,第三方源随后也停止提供服务。
像这样的Dockerfile自然也无法编译运行了:1
2
3
4
5
6FROM centos:6
RUN yum makecache && \
yum install -y bash
CMD ["/bin/bash"]
还好,CentOS提供了归档源 https://vault.centos.org/。那么如何在Dockerfile中配置呢?
借助sed修改CentOS-*.repo
文件
sed(流编辑器、stream editor),是一个使用简单紧凑的编程语言来解析和转换文本Unix实用程序。大部分的Linux内置了这一程序。sed是最早支持正则表达式的工具之一,至今仍然用于文本处理,特别是用于替换命令。
执行脚本:1
2
3
4sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos/|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
这段脚本来自清华大学开源软件镜像站,意为将/etc/yum.repos.d/CentOS-*.repo
中的镜像地址修改为清华的centos-vault镜像。
其中s
表示替换,|
是分隔符,^
匹配行首,g
表示全局,-i.bak
表示就地编辑文件,并将原文件改名,加上.bak
的后缀。如果没有-i
,修改好的文件只会输出到控制台,不会写入到文件里。
修改系统变量releasever
但只有这样还不够,编译Docker镜像,会报以下错误:1
2https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6/os/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned
error: 404 Not Found"
去 https://mirrors.tuna.tsinghua.edu.cn/centos-vault/ 看一下,发现确实不存在6这个文件夹。查阅CentOS-*.repo
,发现6对应的是$releasever。执行cat /etc/issue
查看系统版本,毫无疑问,是CentOS 6的最后一个版本6.10。
为什么Docker镜像里的$releasever
值为6,这里不得而知,但我们可以这样修改:1
echo '6.10' > /etc/yum/vars/releasever
总结,最终的Dockerfile如下:1
2
3
4
5
6
7
8
9
10
11
12FROM centos:6
RUN echo '6.10' > /etc/yum/vars/releasever
RUN sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://mirror.centos.org/centos/|baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-vault/|g' \
-i.bak \
/etc/yum.repos.d/CentOS-*.repo
RUN yum makecache && \
yum install -y bash
CMD ["/bin/bash"]
参考资料:
Wiki - sed