加速“apt-get update”以加速Docker映像构建

nbnkbykc  于 2022-11-22  发布在  Docker
关注(0)|答案(4)|浏览(267)

我想将curl添加到Docker映像中,我在Docker文件中使用以下命令来完成此操作:

RUN apt-get update
RUN apt-get install curl ca-certificates -y

我的问题是初始更新需要相当长的时间(2分钟),所以当我调试我的Dockerfile时,迭代很慢。特别是当我在RUN apt-get update之前进行更改时,这会使Docker的图像缓存无效。
有没有什么方法可以更有选择性地使用apt-get update,使它只更新足够的索引到哪里下载curl?或者其他一些技术,我可以用来加快我的Docker构建?
下面是整个Dockerfile,

FROM postgres:9.6.10
ADD data/tsvs.tar.gz /standard_data
COPY postgres/*.sql /docker-entrypoint-initdb.d/

RUN apt-get update
RUN apt-get install curl ca-certificates -y
RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN apt-get install postgis postgresql-9.6-postgis-scripts -y

我目前正在对postgres/*.sql中的SQL文件进行更改,因此该高速缓存无效。

yks3o0rb

yks3o0rb1#

一个图像被组织在层中,每一层都依赖于后面的前一层。层也被缓存以提高速度。
当你再次运行构建的时候,请检查dockerfile中命令行的校验和是否改变了。如果没有,那么它会从缓存中提取该层。但是如果改变了,那么它会重建后面的和所有后续的层。
在您的特定情况下,ADD指令会在您每次进行变更时产生新图层,并触发所有要重新建置的后续图层。
在修复此问题之前,请先移动安装。
您还应该将所有安装放在一行上,并在完成后清理apt缓存。

RUN apt-get install curl ca-certificates -y && \
  curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - && \
  apt-get install postgis postgresql-9.6-postgis-scripts -y && \
  rm -rf /var/cache/apt && \
  apt-get clean
8tntrjer

8tntrjer2#

如果我把curl安装文件移到我要修改的部分之前,该高速缓存会更频繁地命中。

FROM postgres:9.6.10
RUN apt-get update
RUN apt-get install curl ca-certificates -y
RUN curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN apt-get install postgis postgresql-9.6-postgis-scripts -y

ADD data/tsvs.tar.gz /standard_data
COPY postgres/*.sql /docker-entrypoint-initdb.d/
COPY postgres/subsetting.s* /docker-entrypoint-initdb.d/

感谢Caleb H.在他的评论中考虑到了这一点。

jjjwad0x

jjjwad0x3#

This post on reddit建议将本地apt sources.list复制到带有COPY sources.list /etc/apt/的容器中,这样可以帮助容器的apt update使用本地镜像,从而加快速度

ef1yzkbh

ef1yzkbh4#

您可以使用sedsources.list链接替换为镜像,这样在运行apt时它总是选择最佳镜像。
对于Ubuntu,可以在运行apt之前将其添加到Docker文件中,

RUN sed -i 's/htt[p|ps]:\/\/archive.ubuntu.com\/ubuntu\//mirror:\/\/mirrors.ubuntu.com\/mirrors.txt/g' /etc/apt/sources.list

这将使用sed在sources.list文件中将默认的http(s)://archive.ubuntu.com替换为mirror://mirrors.ubuntu.com/mirrors.txt
测试了在Ubuntu 20.04 Docker上的工作。
注意:您可能需要安装ca-certificates来删除运行apt时的证书错误。

相关问题