加速 'apt-get update' 以加速 Docker 图像构建

speeding up 'apt-get update' to speed up Docker image builds

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

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

我的问题是初始更新需要很长时间才能完成 运行(2 分钟),因此当我调试 Docker 文件时,迭代速度很慢。特别是当我在 RUN apt-get update 之前进行更改时,这会使 Docker 的图像缓存无效。

有没有什么方法可以让 apt-get update 更有选择性,所以它只更新足以索引下载位置 curl?或者我可以用来加速我的 Docker 构建的一些其他技术?

这是整个Docker文件,

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 文件,因此缓存失效。

如果我将 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/

h/t 感谢 Caleb H. 的评论。

图像是分层组织的,每一层都依赖于前一层。层也被缓存以提高速度。

当您 运行 再次构建时,请继续检查 dockerfile 中命令行的校验和是否更改。如果没有,则它会从缓存中拉出该层。但如果它这样做了,那么它会重建后面的所有后续层。

在您的特定情况下,每次您进行更改时 ADD 命令都会生成一个新层,这会触发所有后续层的重建。

在解决此问题之前移动安装。

您还应该将所有安装放在 1 行,并在完成后清理 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

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