GOOGLE ADS

суббота, 7 мая 2022 г.

Кэширование зависимостей Rust с помощью сборки Docker

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

Докерфайл:

FROM rust
WORKDIR /var/www/app
COPY..
EXPOSE 8080
RUN cargo run

докер-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()
}

Груз.томл:

[package]
name = "hello-world"
version = "0.1.0"
authors = []
edition = "2018"
[dependencies]
actix-web = "1.0"

Решение проблемы

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

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

Докерфайл

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 «приложение» основано на том, что вы указали в своем Cargo.toml для своего двоичного файла.

манекен.rs

fn main() {}

Груз.томл

[package]
name = "app"
version = "0.1.0"
authors = ["..."]
[[bin]]
name = "app"
path = "src/main.rs"
[dependencies]
actix-web = "1.0.0"

источник/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()
}

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...