加速 '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
使用本地镜像,这可能会加快速度
我想将 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
使用本地镜像,这可能会加快速度