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

部署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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:52:38