我正在将Docker容器中的带有Rocket.rs的Rust应用程序部署到Heroku。每次进行一次小更改时,我都必须推动整个容器。这需要重新下载所有防锈组件(rustc,rust-std,cargo等),重新下载所有依赖项,并重新推送图层。特别是,有一个1.02 GB的层每 次被推送,大约需要30分钟。每次。我该如何避免:
以下是与我所有相关文件的要点:https://gist.github.com/vcapra1/0a857aac8f05277e65ea5d86e8e4e239
顺便说一句,我的代码非常简单:(这是唯一的.rs文件)
#![feature(proc_macro_hygiene, decl_macro)]
#[macro_use] extern crate rocket;
use std::fs;
#[get("/")]
fn index() -> &'static str {
"Hello from Rust!"
}
fn main() {
rocket::ignite().mount("/", routes![index]).launch();
}
答案 0 :(得分:2)
每次都重新下载rustc,rust-std,cargo和rust-docs。 每次重新下载相同但未更改的依赖项
您应该cache这些步骤。
每次重新推送1.02 GB的层
您不需要任何Rust工具链即可运行已编译的二进制应用程序,因此只需使用debian:8-slim
甚至是alpine
即可运行它。
这会将图片大小减小到84.4MB:
FROM rust:1.31 as build
RUN USER=root cargo new --bin my-app
WORKDIR /my-app
# Copy manifest and build it to cache your dependencies.
# If you will change these files, then this step will rebuild
COPY rust-toolchain Cargo.lock Cargo.toml ./
RUN cargo build --release && \
rm src/*.rs && \
rm ./target/release/deps/my_app*
# Copy your source files and build them.
COPY ./src ./src
COPY ./run ./
RUN cargo build --release
# Use this image to reduce the final size
FROM debian:8-slim
COPY --from=build /my-app/run ./
COPY --from=build /my-app/target/release/my-app ./target/release/my-app
CMD ["./run"]