You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust代码换行导致Docker容器中panic消息不显示问题

Rust Actix Web服务容器化后panic消息异常问题

我正在将一个基于Actix Web的Rust服务容器化,虽然不是第一次做容器项目,但对相关概念还不熟,问题可能比较基础。

运行构建好的镜像时,程序以代码0退出,看不到任何panic消息,但实际上代码里用expect获取未定义的环境变量,按理说应该触发panic。

原main函数代码如下:

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    println!("Hello, world!");
    env_logger::init_from_env(Env::default().default_filter_or("info"));

    let bind_ip = std::env::var("BIND_IP").expect("Must define $BIND_IP");
    let bind_port: u16 = std::env::var("BIND_PORT")
        .expect("Must define $BIND_PORT")
        .parse()
        .expect("Got binding port, but failed to parse to u16");

    HttpServer::new(move || {
        App::new()
            .service(hello_world)
            .service(purchase)
            .wrap(Logger::default())
    })
    .bind((bind_ip, bind_port))?
    .run()
    .await
}

之后我发现,在bind_ip赋值行后添加换行,就能在终端看到panic消息,修改后的代码片段如下:

env_logger::init_from_env(Env::default().default_filter_or("info"));

    let bind_ip = std::env::var("BIND_IP").expect("Must define $BIND_IP");

    let bind_port: u16 = std::env::var("BIND_PORT")
        .expect("Must define $BIND_PORT")
        .parse()
        .expect("Got binding port, but failed to parse to u16");

把换行换成注释也能解决问题。而且这个换行在容器外运行(cargo run或直接调用可执行文件)时完全没有影响。

我没在网上找到Rust panic消息在Docker容器中异常的相关信息,尝试简化复现但只有无换行的版本会出现问题。我的环境是WSL2,Docker版本20.10.22。

编辑补充:根据缓存相关的反馈,测试发现执行docker system prune -a全量清理后,第一次构建会失败,任意修改文件后第二次构建就能生成正常镜像。

Dockerfile内容如下:

FROM rust:1.67 as builder
RUN USER=root cargo new --bin myapp
WORKDIR myapp
COPY ./Cargo.lock ./Cargo.lock
COPY ./Cargo.toml ./Cargo.toml
RUN cargo build --release

COPY ./ ./
RUN cargo build --release

FROM debian:bullseye-slim
RUN apt-get update && apt-get install && rm -rf /var/lib/apt/lists/* tmp/* /var/tmp/*

COPY --from=builder /myapp/target/release/purchasing /usr/local/bin/purchasing

EXPOSE 9000
ENV RUST_BACKTRACE=1
ENV SCHEMA_REGISTRY_ADDRESS=localhost:8082
ENV KAFKA_BROKER_ADDRESS=localhost:9092
ENV BIND_IP=0.0.0.0
ENV BIND_PORT=9000
CMD ["purchasing"]

内容的提问来源于stack exchange,提问作者Ecinori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:07:22