我们正在开发 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"
对可能的原因有什么想法吗?
我会调整
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-*