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

时间:2019-01-25 16:19:54

标签: docker heroku rust

我正在将Docker容器中的带有Rocket.rs的Rust应用程序部署到Heroku。每次进行一次小更改时,我都必须推动整个容器。这需要重新下载所有防锈组件(rustc,rust-std,cargo等),重新下载所有依赖项,并重新推送图层。特别是,有一个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();
}

1 个答案:

答案 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"]