Docker COPY --link 是否会忽略 .dockerignore 规则?
问题解答
核心结论
COPY --link没有禁用.dockerignore,你遇到的性能差异是由两者的实现逻辑差异导致的。
原因分析
普通的COPY . .执行逻辑:
- 先读取
.dockerignore规则,在本地构建上下文阶段就过滤掉所有被排除的文件 - 只把符合规则的文件发送到Docker构建引擎,所以你本地的20GB测试文件完全不会被处理,自然瞬间完成
而COPY --link . .的实现逻辑不同:
- 它会直接扫描本地整个目录的所有文件
- 在容器内部的目标路径中,再根据
.dockerignore规则过滤掉不需要的文件 - 虽然最终不会复制那些20GB的测试文件,但扫描整个目录(包括大量被忽略的文件)的过程需要花费大量时间,这就是你看到耗时近一分钟的原因
Docker官方文档里提到的"性能等同于或优于默认行为",是在没有大量被忽略文件的场景下。当本地存在大量被.dockerignore排除的文件时,COPY --link的扫描逻辑会导致性能下降。
解决方案
- 如果项目结构暂时无法调整,可以在这个构建阶段暂时去掉
--link参数,换回普通的COPY . . - 优化目录结构:把需要复制到镜像中的文件(比如
src、Cargo.toml、data、fonts等)单独放在一个子目录下,这样COPY --link只需要扫描这个子目录,避免遍历大量被忽略的文件
附:你的配置信息
Dockerfile
# syntax=docker/dockerfile:1.4 FROM clux/muslrust:1.69.0-nightly-2023-02-15 AS chef USER root RUN cargo install cargo-chef WORKDIR /app FROM chef AS planner ARG CARGO_INCREMENTAL=0 COPY --link . . <--- 此步骤耗时极长 ...
.dockerignore
* !src !Cargo.toml !Cargo.lock !data/default.toml !data/favicon.ico !data/example.ttl !data/*.html !data/*.css !fonts
内容的提问来源于stack exchange,提问作者Konrad Höffner
相关产品推荐
相关产品推荐

