我在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()
}
首先,关于构建时间:如果您某些永远不要在容器外部运行任何与该项目相关的Rust,则可以将./target
映射到容器中。映射~/.cargo/registry
实际上并不映射构建工件,这就是为什么您发现自己重新编译所有内容的原因。如果您的基本操作系统的文件系统不支持atime / ctime字段,则此操作将不起作用。
无法触及的部分更难弄清楚。您已经在问候世界中完成了“正确”的事情;您已经在Dockerfile中做了正确的事情(公开端口是唯一能够在外部映射端口的要求)。错误可能存在多个问题,最好将其保留给纯docker
问题。要快速检查是您的容器还是码头工人出了故障,请将容器网络模式切换为host
(服务定义中的network_mode: host
)。