如何通过代理缓存并复用构建脚本执行期间下载的二进制文件
Docker构建依赖缓存方案调整说明
核心失效原因
- 你当前使用的Nginx默认是反向Web服务器,不支持正向代理的流量缓存逻辑,你测试时收到的301状态码是Nginx默认的重定向规则,并未实际走代理转发流程,所以不符合缓存需求。
- Docker镜像构建阶段默认使用独立的bridge网络,和你docker-compose启动的Nginx容器网络不互通,你配置的
0.0.0.0:8080是构建容器的本地地址,无法访问到同编排下的代理服务。 - 普通代理配置无法直接缓存HTTPS流量的内容,TLS加密状态下代理只能识别访问域名,无法获取具体请求的资源信息,无法做内容匹配缓存。
现有架构调整方案
1. 替换代理组件
Nginx不适合做正向缓存代理,换成自带正向代理+磁盘缓存能力的Squid即可,配置更简单,对二进制文件缓存的适配性更好。
2. 调整docker-compose配置
提前启动代理容器,配置host网络模式让构建阶段可以直接访问代理端口,docker-compose参考配置如下:
services: 业务镜像: build: context: . network: host args: - http_proxy=http://127.0.0.1:8080 - https_proxy=http://127.0.0.1:8080 squid-proxy: image: sameersbn/squid:latest ports: - "8080:3128" volumes: - ./squid-cache:/var/spool/squid - ./squid.conf:/etc/squid/squid.conf
3. 配置Squid缓存规则
在squid.conf中加入以下配置即可实现全量资源磁盘缓存,缓存大小、有效期可自行调整:
http_port 3128 cache_dir ufs /var/spool/squid 10000 16 256 maximum_object_size 1024 MB cache allow all http_access allow all
如果需要缓存HTTPS资源,给Squid配置SSL根证书,将证书导入到业务镜像的系统根证书信任列表,即可解密HTTPS流量做内容缓存。
更轻量的替代方案(无需搭建代理)
如果仅用于缓存构建过程的依赖和产物,还有更简单的实现方式:
- 用Docker原生的
RUN --mount=type=cache语法,将依赖下载目录挂载为Docker全局缓存卷,比如npm的/root/.npm、maven的/root/.m2、apt的/var/cache/apt/archives,示例Dockerfile写法:
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ apt update && apt install -y nginx
- 频繁下载的二进制文件提前存到内部文件服务,构建时优先从内部地址拉取,避免重复公网下载。
- 数据库内容构建产物可单独打包为基础镜像,业务镜像直接基于该基础镜像构建,无需每次构建都重新初始化数据库内容。
内容的提问来源于stack exchange,提问作者Lubomir Gospodinov
相关产品推荐
相关产品推荐

