Кэшируйте зависимости Rust с помощью сборки Docker - PullRequest
1 голос
/ 20 октября 2019

У меня есть Привет мир веб-проект в Rust + Actix-Web. У меня есть несколько проблем. Во-первых, каждое изменение в коде вызывает перекомпиляцию всего проекта, включая загрузку и компиляцию каждого ящика. Я хотел бы работать как в обычной разработке - это означает, что ящики скомпилированы в кеш и перекомпилируются только моя кодовая база. Вторая проблема заключается в том, что это не раскрывает мое приложение. Он недоступен через веб-браузер

Dockerfile:

FROM rust

WORKDIR /var/www/app

COPY . .

EXPOSE 8080

RUN cargo run

docker-compose.yml:

version: "3"
services:
  app:
    container_name: hello-world
    build: .
    ports:
      - '8080:8080'
    volumes:
      - .:/var/www/app
      - registry:/root/.cargo/registry

volumes:
  registry:
    driver: local

main.rs:

extern crate actix_web;

use actix_web::{web, App, HttpServer, Responder};

fn index() -> impl Responder {
    "Hello world"
}

fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(web::resource("/").to(index)))
        .bind("0.0.0.0:8080")?
        .run()
}

Cargo.toml:

[package]
name = "hello-world"
version = "0.1.0"
authors = []
edition = "2018"

[dependencies]
actix-web = "1.0"

1 Ответ

1 голос
/ 20 октября 2019

Похоже, вы не одиноки в своем стремлении кешировать зависимости от ржавчины через процесс сборки докера. Вот отличная статья, которая поможет вам в этом: https://blog.mgattozzi.dev/caching-rust-docker-builds/

Суть в том, что вам сначала нужно dummy.rs и ваш Cargo.toml, затем создайте его для кеширования зависимостей и затем скопируйтеисточник приложения позже, чтобы не аннулировать кеш при каждой сборке.

Dockerfile

FROM rust
WORKDIR /var/www/app
COPY dummy.rs .
COPY Cargo.toml .
RUN sed -i 's#src/main.rs#dummy.rs#' Cargo.toml
RUN cargo build --release
RUN sed -i 's#dummy.rs#src/main.rs#' Cargo.toml
COPY . .
RUN cargo build --release
CMD ["target/release/app"]

Имя приложения CMD "app" основано на том, что вы указали в Cargo.toml для своего двоичного файла.

dummy.rs

fn main() {}

Cargo.toml

[package]
name = "app"
version = "0.1.0"
authors = ["..."]
[[bin]]
name = "app"
path = "src/main.rs"

[dependencies]
actix-web = "1.0.0"

src / main.rs

extern crate actix_web;

use actix_web::{web, App, HttpServer, Responder};

fn index() -> impl Responder {
    "Hello world"
}

fn main() -> std::io::Result<()> {
    HttpServer::new(|| App::new().service(web::resource("/").to(index)))
        .bind("0.0.0.0:8080")?
        .run()
}
...