如何在Docker镜像中引入libssl.so.1.1解决运行依赖报错
解决Docker镜像中OpenSSL 1.1依赖缺失问题
本地基于Ubuntu 20.04(自带OpenSSL 1.1)编译的g++单文件服务器程序,放入默认Ubuntu镜像(默认是22.04及以上版本,自带OpenSSL 3)构建的Docker镜像后,运行报错:
./svr: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
原Dockerfile如下:
FROM ubuntu ARG APPDIR=/usr/local/myserver WORKDIR ${APPDIR} # copy my single server program file COPY build/bin/svr ./ # install openssl into the image RUN apt-get -y update RUN apt-get -y install openssl #RUN apt-get -y install libssl-dev # run the server program EXPOSE 1080 EXPOSE 1443 CMD ./svr
以下是几种优雅的解决方案:
方案1:使用与本地编译环境匹配的Ubuntu基础镜像
本地编译环境为Ubuntu 20.04,直接指定该版本的Ubuntu镜像作为基础镜像,镜像内默认的OpenSSL版本就是1.1,与程序依赖完全匹配,无需额外调整:
修改后的Dockerfile:
FROM ubuntu:20.04 ARG APPDIR=/usr/local/myserver WORKDIR ${APPDIR} COPY build/bin/svr ./ RUN apt-get -y update && apt-get -y install openssl EXPOSE 1080 EXPOSE 1443 CMD ./svr
方案2:静态编译程序,消除动态库依赖
编译程序时将OpenSSL及其他依赖静态链接到可执行文件中,镜像无需安装任何OpenSSL相关包,程序即可独立运行:
编译命令示例(g++):
g++ -o build/bin/svr your_source_code.cpp -static-libstdc++ -lssl -lcrypto -static
修改后的Dockerfile可简化为:
FROM ubuntu:latest ARG APPDIR=/usr/local/myserver WORKDIR ${APPDIR} COPY build/bin/svr ./ EXPOSE 1080 EXPOSE 1443 CMD ./svr
方案3:在新版Ubuntu镜像中安装OpenSSL 1.1包(适用于必须用新版镜像的场景)
如果需要基于Ubuntu 22.04及以上版本构建镜像,可通过安装libssl1.1包补充缺失的依赖:
修改后的Dockerfile:
FROM ubuntu:latest ARG APPDIR=/usr/local/myserver WORKDIR ${APPDIR} COPY build/bin/svr ./ RUN apt-get -y update && apt-get -y install libssl1.1 EXPOSE 1080 EXPOSE 1443 CMD ./svr
注意:部分新版Ubuntu镜像可能需要先启用universe源,可在apt-get update前添加:
RUN apt-get -y update && apt-get -y install software-properties-common && add-apt-repository universe
内容的提问来源于stack exchange,提问作者Zhou
相关产品推荐
相关产品推荐

