Dockerfile:如何根据 ubuntu 版本设置 apt 镜像

Dockerfile: How to set apt mirror based on the ubuntu release

在构建 docker 映像时,可以通过覆盖 /etc/apt/sources.list 来设置自定义 apt 镜像,例如

FROM ubuntu:focal

RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt focal main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt focal-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt focal-security main restricted universe multiverse" >> /etc/apt/sources.list
...

如果基础图像是一个变量,例如FROM ${DISTRO}sources.list应根据ubuntu版本进行调整。

我试过 $(lsb_release -cs) 如下:

RUN echo "deb mirror://mirrors.ubuntu.com/mirrors.txt $(lsb_release -cs) main restricted universe multiverse" > /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt $(lsb_release -cs)-updates main restricted universe multiverse" >> /etc/apt/sources.list && \
    echo "deb mirror://mirrors.ubuntu.com/mirrors.txt $(lsb_release -cs)-security main restricted universe multiverse" >> /etc/apt/sources.list

但是它说 lsb_release: not found

解决方法是在 运行 之前安装软件包。

RUN apt-get update && apt-get install -y lsb-release

但是,lsb-release 包的安装在某些地区可能会很慢。

那么问题来了,在使用apt之前有没有正确设置apt源镜像的方法?

lsb-release 包不包含在最小 Ubuntu 映像中,但您可以使用 /etc/lsb-release/etc/os-release 文件代替(第二个在常用,参考this answer对比。

对于Dockerfile,只需将$(lsb_release -cs)更改为$(. /etc/os-release && echo $VERSION_CODENAME),您就不会浪费时间更新和安装包了。

只需使用 sed 就地编辑现有的 sources.list 文件。以下代码片段将就地修改源文件,而不考虑确切的发行版(并且对 运行 在其他基于 Debian 的发行版上也是安全的,但不会修改那里的文件)。

它将 http://archive.ubuntu.com/ubuntu 的所有引用更改为 mirror://mirrors.ubuntu.com/mirrors.txt(这告诉内置 apt 客户端在从网络获取时自动使用本地镜像)在 /etc/apt/sources.list

sed -i -e 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//mirror:\/\/mirrors\.ubuntu\.com\/mirrors\.txt/' /etc/apt/sources.list

要在 Dockerfile 中使用,只需 RUN 这个 - 最好尽可能早地在 Dockerfile 中使用:

RUN sed -i -e 's/http:\/\/archive\.ubuntu\.com\/ubuntu\//mirror:\/\/mirrors\.ubuntu\.com\/mirrors\.txt/' /etc/apt/sources.list

在 dockerfile 中反映 .. /etc/os-release && echo $VERSION_CODENAMElsb-release