Почему Heroku каждый раз перестраивает мой контейнер Docker? - PullRequest
0 голосов
/ 25 января 2019

Я развертываю приложение Rust с Rocket.rs в контейнере Docker для Heroku.Каждый раз, когда я делаю одно маленькое изменение, мне нужно сдвинуть весь контейнер.Это потребовало повторной загрузки всех компонентов ржавчины (rustc, rust-std, Cargo и т. Д.), Повторной загрузки всех зависимостей и повторной загрузки слоев.В частности, существует один слой размером 1,02 ГБ, который отправляется каждые раз, что занимает около 30 минут.Каждый раз.Как можно избежать:

  • Повторная загрузка документов rustc, rust-std, cargo и rust-docs каждый раз
  • Повторная загрузка неизменных зависимостей каждый раз
  • Повторное добавление слоя 1,02 ГБ каждый раз

Вот Гист со всеми моими соответствующими файлами: 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 голосов
/ 26 января 2019

Повторно загружайте rustc, rust-std, cargo и rust-docs каждый раз. Повторная загрузка одинаковых, неизменных зависимостей каждый раз

Вы должны кэшировать эти шаги.

Повторное добавление слоя размером 1,02 ГБ каждый раз

Вам не нужен ни один из наборов инструментов Rust для запуска скомпилированного бинарного приложения, поэтому вы можете просто использовать debian:8-slim или даже alpine для его запуска.

Это уменьшит размер изображения до 84,4 МБ:

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...