Docker运行Rust构建的mapservice缺失libssl.so.1.1依赖求助
问题描述
我是Docker新手,首次遇到此类错误。以下是我的Dockerfile:
FROM rust:latest as builder ENV APP mapservice WORKDIR /usr/src/$APP COPY . . RUN cargo install --path . FROM debian:buster-slim RUN apt-get update && rm -rf /var/lib/apt/lists/* COPY --from=builder /usr/local/cargo/bin/$APP /usr/local/bin/$APP #export this actix web service to port 8080 and 0.0.0.0 EXPOSE 8080 CMD ["mapservice"]
执行命令:
docker run -it --rm -p 8080:8080 mapservice
出现错误:
mapservice: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
不清楚错误原因,是否与main.rs硬编码APIKEY有关?设备为M1 Pro Mac,求解决方法。另外,类似Dockerfile的示例项目运行正常,部署到AWS时还出现8080端口健康检查错误,是否是Dockerfile存在问题?
解决方法
1. 修复libssl依赖缺失问题
这个错误和main.rs里的APIKEY硬编码完全无关,核心原因是debian:buster-slim基础镜像没有预装OpenSSL 1.1运行库,而你的Rust程序编译时依赖了OpenSSL,导致运行时找不到对应的动态库。
修改Dockerfile的debian阶段,添加依赖安装步骤:
FROM rust:latest as builder ENV APP mapservice WORKDIR /usr/src/$APP COPY . . RUN cargo install --path . FROM debian:buster-slim # 安装libssl1.1和证书文件(如果程序需要发起HTTPS请求) RUN apt-get update && apt-get install -y --no-install-recommends libssl1.1 ca-certificates \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /usr/local/cargo/bin/$APP /usr/local/bin/$APP EXPOSE 8080 CMD ["mapservice"]
另外,M1 Pro是ARM架构,如果你需要跨架构构建(比如在本地ARM机器上构建x86镜像部署到AWS),可以在builder阶段指定平台:
FROM --platform=linux/amd64 rust:latest as builder
2. 解决AWS健康检查失败问题
健康检查通不过大概率是你的Actix Web服务没有绑定到0.0.0.0,而是默认绑定了127.0.0.1。这种情况下,服务只能在容器内部的localhost访问,外部(包括AWS的健康检查系统)无法连接到8080端口。
检查main.rs中的服务启动代码,确保绑定地址是0.0.0.0:8080,示例代码如下:
HttpServer::new(|| { App::new() // 这里添加你的路由逻辑 }) .bind(("0.0.0.0", 8080))? .run() .await?;
注意:Dockerfile里的EXPOSE只是声明容器要开放的端口,不会改变服务的实际绑定地址,关键还是代码里的配置。
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

