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
相关产品推荐
相关产品推荐

