使用docker-compose的args参数为何会增加构建耗时?
问题原因分析
- 核心差异来自docker-compose与原生
docker build的缓存逻辑不一致:当你在docker-compose的build配置中添加args参数时,哪怕这个ARG仅在Dockerfile里声明但未实际使用,docker-compose会将args的存在/变化视为构建上下文的一部分,生成全新的缓存键,导致无法复用之前的镜像缓存,只能从头构建,这就是多花20秒的原因。而直接用docker build --build-arg时,Docker引擎能正确识别该ARG未修改镜像内容,依然复用原有缓存,所以速度和不加参数时一致。 - 额外的变量处理开销:当args里用到
${USER_ID}这类环境变量时,docker-compose会额外执行变量替换的校验逻辑,也会增加少量构建耗时。
优化方法
- 清理无用ARG定义:如果Dockerfile里只是声明了
ARG db_hostname但没有在任何构建步骤中使用,直接删掉这行,同时移除docker-compose里的args配置,立刻恢复快速构建。 - 强制复用缓存:在docker-compose.yml的build配置中添加
cache_from,指定要复用的镜像缓存,避免重新构建:build: context: /docker/container-setups/user dockerfile: user_webserver.dockerFile args: - db_hostname=${USER_ID}_database cache_from: - your-service-image:latest - 改用运行时环境变量传递参数:如果
db_hostname是容器运行时需要的配置(而非构建时),不要用ARG,改用environment字段传递:
docker-compose.yml示例:
之后在容器内的应用代码中直接读取环境变量services: user-webserver: build: context: /docker/container-setups/user dockerfile: user_webserver.dockerFile environment: - DB_HOSTNAME=${USER_ID}_databaseDB_HOSTNAME即可,完全不影响构建速度。 - 升级docker-compose版本:旧版本的docker-compose在args处理和缓存策略上存在性能缺陷,升级到v2.x及以上稳定版本,大概率能解决构建慢的问题。
内容的提问来源于stack exchange,提问作者Dio Anderson
相关产品推荐
相关产品推荐

