docker内部的Rust actix_web无法实现,为什么?

时间:2019-07-24 07:54:04

标签: docker rust rust-actix

我正在尝试为我的rust程序制作一个docker容器,让我们看看

Dockerfile

FROM debian

RUN apt-get update && \
    apt-get -y upgrade && \
    apt-get -y install git curl g++ build-essential

RUN curl https://sh.rustup.rs -sSf | bash -s -- -y

WORKDIR /usr/src/app

RUN git clone https://github.com/unegare/rust-actix-rest.git

RUN ["/bin/bash", "-c", "source $HOME/.cargo/env; cd ./rust-actix-rest/; cargo build --release; mkdir uploaded"]

EXPOSE 8080

ENTRYPOINT ["/bin/bash", "-c", "echo 'Hello there!'; source $HOME/.cargo/env; cd ./rust-actix-rest/; cargo run --release"]

要运行的cmd:docker run -it -p 8080:8080 rust_rest_api/dev

但是来自外部curl -i -X POST -F files[]=@img.png 127.0.0.1:8080/upload的卷曲会导致curl: (56) Recv failure: Соединение разорвано другой стороной,即被通道另一侧拒绝

但在容器内:

root@43598d5d9e85:/usr/src/app# lsof -i
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
actix_003   6 root    3u  IPv4 319026      0t0  TCP localhost:http-alt (LISTEN)

但是在没有docker的情况下运行程序可以正常工作,并且可以充分处理curl发出的相同请求。

并在容器内:

root@43598d5d9e85:/usr/src/app# curl -i -X POST -F files[]=@i.jpg 127.0.0.1:8080/upload
HTTP/1.1 100 Continue

HTTP/1.1 201 Created
content-length: 70
content-type: application/json
date: Wed, 24 Jul 2019 08:00:54 GMT

{"keys":["uploaded/5nU1nHznvKRGbkQaWAGJKpLSG4nSAYfzCdgMxcx4U2mF.jpg"]}

外面有什么问题?

2 个答案:

答案 0 :(得分:1)

如果您像我一样,并按照Actix网站上的示例进行操作,则您可能已经编写了类似的文字或其中的一些变体:

fn main() {
    HttpServer::new(|| {
        App::new()
            .route("/", web::get().to(index))
            .route("/again", web::get().to(index2))
    })
    .bind("127.0.0.1:8088")
    .unwrap()
    .run()
    .unwrap();
}

这里的问题是您要绑定到特定IP,而不是使用0.0.0.0绑定到主机容器上的所有IP。我遇到了与您相同的问题,并将代码更改为:

fn main() {
    HttpServer::new(|| {
        App::new()
            .route("/", web::get().to(index))
            .route("/again", web::get().to(index2))
    })
    .bind("0.0.0.0:8088")
    .unwrap()
    .run()
    .unwrap();
}

这可能对您来说不是问题,如果不查看运行服务器的代码就无法知道。

答案 1 :(得分:0)

要完成约翰所说的话,就我而言,我必须使用一个元组:.bind( ("0.0.0.0", 8088) )