部署Rust Docker容器时遇libssl.so.1.1共享库加载错误求助
问题原因与解决方案
核心错误:重复的FROM指令
你的Dockerfile里连续写了两个FROM:
FROM debian:bullseye FROM postgres:latest
Docker会忽略第一个FROM,最终仅使用postgres:latest作为基础镜像。你后续执行的apt-get install libssl-dev是在被丢弃的debian层中执行的,运行容器时根本没生效,这是导致找不到libssl.so.1.1的根本原因。
另外,postgres:latest基于Debian Bookworm,默认安装的是libssl3(版本3.0),而你的Rust程序是在基于Debian Bullseye的rust:latest镜像中编译的,依赖的是libssl1.1,版本不匹配也会引发这个错误。
解决方案一:基于postgres:bullseye镜像构建(匹配依赖版本)
修改Dockerfile,直接使用基于Bullseye的postgres镜像,同时确保依赖安装生效:
# 构建阶段:用rust镜像编译程序 FROM rust:latest as builder WORKDIR /usr/src/myapp COPY . . RUN cargo install --path . # 运行阶段:用基于bullseye的postgres镜像(自带libssl1.1) FROM postgres:14-bullseye ENV POSTGRES_USER user ENV POSTGRES_DB db # 复制编译好的程序 COPY --from=builder /usr/local/cargo/bin/myapp /usr/local/bin/myapp CMD ["myapp"]
说明:postgres:14-bullseye基于Debian Bullseye,系统自带libssl.so.1.1,不需要额外安装,直接复制程序即可运行。
解决方案二:静态编译Rust程序(彻底消除系统依赖)
如果不想受限于基础镜像的lib版本,可以静态编译你的Rust程序,让程序自带所有依赖:
修改构建阶段的cargo install命令,添加静态编译参数:
FROM rust:latest as builder WORKDIR /usr/src/myapp COPY . . # 静态编译程序,指定目标为x86_64-unknown-linux-gnu并启用静态链接 RUN RUSTFLAGS='-C target-feature=+crt-static' cargo install --path . --target x86_64-unknown-linux-gnu # 运行阶段可以用更轻量的镜像,比如postgres:latest或者debian:slim FROM postgres:latest ENV POSTGRES_USER user ENV POSTGRES_DB db COPY --from=builder /usr/local/cargo/bin/x86_64-unknown-linux-gnu/myapp /usr/local/bin/myapp CMD ["myapp"]
说明:静态编译后的程序不依赖系统的libssl库,无论基础镜像是什么版本都能运行。
额外提醒
不建议在同一个容器中同时运行应用和数据库(postgres),生产环境更推荐用Docker Compose将两者分成独立容器,方便管理和扩展。但作为新手,先解决当前运行问题后,再逐步学习容器拆分。
内容的提问来源于stack exchange,提问作者mori_ahk
相关产品推荐
相关产品推荐

