我想将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文件进行更改,因此该高速缓存无效。
4条答案
按热度按时间yks3o0rb1#
一个图像被组织在层中,每一层都依赖于后面的前一层。层也被缓存以提高速度。
当你再次运行构建的时候,请检查dockerfile中命令行的校验和是否改变了。如果没有,那么它会从缓存中提取该层。但是如果改变了,那么它会重建后面的和所有后续的层。
在您的特定情况下,ADD指令会在您每次进行变更时产生新图层,并触发所有要重新建置的后续图层。
在修复此问题之前,请先移动安装。
您还应该将所有安装放在一行上,并在完成后清理apt缓存。
8tntrjer2#
如果我把
curl
安装文件移到我要修改的部分之前,该高速缓存会更频繁地命中。感谢Caleb H.在他的评论中考虑到了这一点。
jjjwad0x3#
This post on reddit建议将本地apt
sources.list
复制到带有COPY sources.list /etc/apt/
的容器中,这样可以帮助容器的apt update
使用本地镜像,从而加快速度ef1yzkbh4#
您可以使用
sed
将sources.list
链接替换为镜像,这样在运行apt时它总是选择最佳镜像。对于Ubuntu,可以在运行apt之前将其添加到Docker文件中,
这将使用sed在sources.list文件中将默认的
http(s)://archive.ubuntu.com
替换为mirror://mirrors.ubuntu.com/mirrors.txt
。测试了在Ubuntu 20.04 Docker上的工作。
注意:您可能需要安装
ca-certificates
来删除运行apt时的证书错误。