为什么Heroku每次都会重建我的Docker容器?

vca*_*ra1 7 heroku rust docker

我正在使用Docker容器中的Rocket.rs将Rust应用程序部署到Heroku.每次我做一个小改动,我都要推动整个容器.这需要重新下载所有生锈组件(rustc,rust-std,货物等),重新下载所有依赖项,并重新推送层.特别是,每次推送一个1.02 GB的层,大约需要30分钟.每次.我怎样才能避免:

  • 每次都重新下载rustc,rust-std,cargo和rust-docs
  • 每次重新下载相同的,未更改的依赖项
  • 每次重新推送1.02 GB图层

这里是我的所有相关文件,其主旨在于: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();
}
Run Code Online (Sandbox Code Playgroud)

Art*_*nov 1

每次都重新下载 rustc、rust-std、cargo 和 rust-docs。每次都重新下载相同的、未更改的依赖项

您应该缓存这些步骤。

每次重新推送 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"]
Run Code Online (Sandbox Code Playgroud)