如何构建同时包含ASP.NET Core与C++二进制、满足运行依赖的Docker镜像
解决方案
问题根源
报错的核心原因是 mcr.microsoft.com/dotnet/aspnet:5.0 是经过裁剪的Debian系统镜像,仅保留了.NET运行所需的最小依赖,缺少你的C程序依赖的OpenMP运行库(libgomp.so.1 属于该组件)。同时需要注意,用Ubuntu 16.04编译的C二进制和最终Debian运行环境存在小概率的版本兼容风险。
方案1:在最终运行镜像中安装缺失依赖(改动最小)
仅需修改Dockerfile的base阶段,添加C++程序所需的运行库即可,修改后的base阶段代码如下:
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base WORKDIR /app EXPOSE 4444 EXPOSE 5599 ENV ASPNETCORE_URLS=https://+:4444;https://+:5599 # 安装C++程序依赖的共享库,执行完清理apt缓存减小镜像体积 RUN apt-get update && \ apt-get install -y --no-install-recommends libgomp1 && \ rm -rf /var/lib/apt/lists/*
如果后续运行还报其他.so文件缺失,可以在ubuntu编译阶段的make命令后添加ldd命令,查看C++程序所有依赖的共享库:
# 加在ubuntu阶段的RUN make命令之后,构建时会输出所有依赖项 RUN ldd /src/bin/PoissonRecon
将输出中缺失的共享库对应的Debian安装包,统一添加到base阶段的安装列表中即可。
方案2:静态编译C++程序(无额外运行依赖)
如果不想给最终镜像添加多余的系统包,可以修改C++程序的Makefile,添加静态编译参数,将所有依赖直接编译到二进制文件中:
- 在Makefile的编译选项(CFLAGS/LDFLAGS)中添加
-static -lgomp -lstdc++ -lm等静态链接参数 - 重新编译后的PoissonRecon二进制无需额外依赖,直接拷贝到最终镜像即可运行
内容的提问来源于stack exchange,提问作者MoonKnight
相关产品推荐
相关产品推荐

