Rust与Docker在开发中的基本用法

问题描述 投票:0回答:1

我在Rust + Actix-web中有hello世界网络项目。我有几个问题。首先是代码的每次更改都会导致重新编译整个项目,包括下载和编译每个板条箱。我想像正常开发一样工作-这意味着缓存已编译的板条箱,仅重新编译我的代码库。第二个问题是它不会暴露我的应用程序。通过网络浏览器无法访问

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()
}
docker rust actix-web
1个回答
0
投票

首先,关于构建时间:如果您某些永远不要在容器外部运行任何与该项目相关的Rust,则可以将./target映射到容器中。映射~/.cargo/registry实际上并不映射构建工件,这就是为什么您发现自己重新编译所有内容的原因。如果您的基本操作系统的文件系统不支持atime / ctime字段,则此操作将不起作用。

无法触及的部分更难弄清楚。您已经在问候世界中完成了“正确”的事情;您已经在Dockerfile中做了正确的事情(公开端口是唯一能够在外部映射端口的要求)。错误可能存在多个问题,最好将其保留给纯docker问题。要快速检查是您的容器还是码头工人出了故障,请将容器网络模式切换为host(服务定义中的network_mode: host)。

© www.soinside.com 2019 - 2024. All rights reserved.