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_CODENAME
为 lsb-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_CODENAME
为 lsb-release