为什么“cargo build”作为“skaffold build”的一部分比“docker build”花费更长的时间

问题描述 投票:0回答:1

我们正在开发 Rust 后端并在 minikube 中进行调试。我有一个构建整个工作区的 Dockerfile,然后只需为每个微服务使用不同的

cargo run
语句部署该映像。

  • 当我从命令行运行
    docker build
    时,构建二进制文件大约需要 3 分钟(即
    cargo build
    步骤)。
 => [10/10] RUN  cargo fetch --locked && cargo build --offline --frozen --timings --verbose                                                          186.3s 
 => exporting to image                                                                                                                               134.2s 
  • 当我运行
    skaffold build
    时,构建二进制文件大约需要 20 分钟。额外时间似乎是在链接阶段,因为
    cargo build
    步骤在 104 秒后显示最后一次警告。
#14 104.5     = note: `#[warn(dead_code)]` on by default
#14 104.5 
#14 1192.5 warning: `xx` (bin "xx") generated 9 warnings (run `cargo fix --bin "xx"` to apply 7 suggestions)
#14 1223.4       Timing report saved to /home/app/target/cargo-timings/cargo-timing-20240531T162451Z.html
#14 1223.4     Finished `dev` profile [unoptimized + debuginfo] target(s) in 19m 52s
#14 DONE 1256.5s

到目前为止我为尽量减少构建时间和差异所做的事情

为了排除网络问题,我的 docker 文件先执行

cargo fetch
,然后执行
cargo run --offline

我的

skaffold.yaml
中有以下内容,以便 docker 构建始终在任一命令中使用 buildKit。

build:
  local:
    useBuildkit: true
    concurrency: 0

这基本上使得

skaffold dev
的使用变得不切实际。

我已在 Cargo.toml 中为

lto
配置文件
禁用了 
dev

[profile.dev]
lto = "off"

对可能的原因有什么想法吗?

rust rust-cargo skaffold
1个回答
0
投票

我会调整

Dockerfile
Skaffold
配置来优化缓存,并分配足够的资源,确保两者都使用
BuildKit
和相同的构建参数,然后,重新定义 Dockerfile,通过分离依赖项和源代码复制来最大化层缓存。为此,请在 skaffold.yaml 中启用缓存,并向 Docker 和 Minikube 分配更多资源。并且不要忘记设置
CARGO_BUILD_JOBS
环境变量以在构建期间利用所有 CPU 核心(适度使用)。 PS:检查具有详细设置的 Skaffold 日志,以帮助查明任何特定的延迟。

FROM rust:1.60 AS builder

WORKDIR /app

# Cache dependencies
COPY Cargo.toml Cargo.lock ./
RUN cargo fetch --locked

# Copy source code
COPY . .

# Build application
RUN cargo build --release --offline

# Final stage
FROM rust:1.60-slim
WORKDIR /app
COPY --from=builder /app/target/release/your-binary /app/
CMD ["./your-binary"]

apiVersion: skaffold/v2beta26
kind: Config
build:
  artifacts:
  - image: your-image-name
    context: .
    docker:
      buildArgs:
        BUILDKIT_INLINE_CACHE: 1
      useBuildkit: true
  local:
    push: false
    useBuildkit: true
  cache:
    cachePaths:
      - /path/to/cache/dir
deploy:
  kubectl:
    manifests:
      - k8s-*
© www.soinside.com 2019 - 2024. All rights reserved.