编写可正常运行yum的CentOS 6 Dockerfile

2020年11月30日,CentOS 6到达了EOL(End of Lifetime)日期,yum官方源随即被归档,第三方源随后也停止提供服务。
图1

像这样的Dockerfile自然也无法编译运行了:

1
2
3
4
5
6
FROM 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
4
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

这段脚本来自清华大学开源软件镜像站,意为将/etc/yum.repos.d/CentOS-*.repo中的镜像地址修改为清华的centos-vault镜像。
其中s表示替换,|是分隔符,^匹配行首,g表示全局,-i.bak表示就地编辑文件,并将原文件改名,加上.bak的后缀。如果没有-i,修改好的文件只会输出到控制台,不会写入到文件里。

修改系统变量releasever

但只有这样还不够,编译Docker镜像,会报以下错误:

1
2
https://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
12
FROM 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