我正在构建一个ASP.NET Core3.1应用程序,它使用IBM.Data.DB2.Core-lnx访问遗留应用程序的DB。它在使用普通Debian图像时工作。但是我想用阿尔卑斯山来代替小图片。关于丢失文件,我犯了一些错误:
加载共享库libpan.so.0时出错:没有这样的文件或目录(/app/clidriver/lib/liblebdb2.so需要)
使用内容搜索,我找到了包含它们的阿尔卑斯包。但是这个应用程序显示出一种奇怪的行为:它启动并运行,直到我在浏览器中打开它的网站。打开它后,容器将退出,其中包含错误代码139,没有消息:
db2_test_1 | info: Microsoft.Hosting.Lifetime[0]
db2_test_1 | Now listening on: http://0.0.0.0:5000
db2_test_1 | info: Microsoft.Hosting.Lifetime[0]
db2_test_1 | Application started. Press Ctrl+C to shut down.
db2_test_1 | info: Microsoft.Hosting.Lifetime[0]
db2_test_1 | Hosting environment: Development
db2_test_1 | info: Microsoft.Hosting.Lifetime[0]
db2_test_1 | Content root path: /app
db2test_db2_test_1 exited with code 139
我尝试用一个虚拟睡眠命令替换我的入口点,并通过使用docker exec
打开容器中的一个shell来手动启动该应用程序。
/app # dotnet DB2Test.dll
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {53574556-0fee-4926-b1f3-6c57cdfd395a} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://0.0.0.0:5000
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
Segmentation fault (core dumped)
我不知道为什么会这样。我的Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-alpine AS sdk-image
WORKDIR /app
COPY DB2Test.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Debug -o /publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-alpine AS runtime-image
WORKDIR /app
COPY --from=sdk-image /publish .
#RUN apk add libxml2-dev openssl-dev zlib zlib-dev libressl libressl-dev libc6-compat linux-pam
RUN apk add libxml2-dev libc6-compat linux-pam
ARG ASPNETCORE_ENVIRONMENT=Development
ENV ASPNETCORE_URLS=http://0.0.0.0:5000
ENV ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT}
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/app/clidriver/lib"
ENTRYPOINT ["dotnet", "DB2Test.dll"]
以及完整Debian构建的Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS sdk-image
WORKDIR /app
COPY DB2Test.csproj .
RUN dotnet restore
COPY . .
RUN dotnet publish -c Debug -o /publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime-image
WORKDIR /app
COPY --from=sdk-image /publish .
RUN apt-get update \
&& apt-get install -y libxml2-dev
ARG ASPNETCORE_ENVIRONMENT=Development
ENV ASPNETCORE_URLS=http://0.0.0.0:5000
ENV ASPNETCORE_ENVIRONMENT=${ASPNETCORE_ENVIRONMENT}
# https://gist.github.com/StevenLiekens/dacbd8cdef93d20bf7fcfc2bdafbce43
ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/app/clidriver/lib"
ENTRYPOINT ["dotnet", "DB2Test.dll"]
正如你所看到的,基本上是一样的。我刚为阿尔卑斯安装了丢失的apk软件包。
ASP.NET核心应用程序本身没有什么特别之处: VS模板有两个包
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.78" />
<PackageReference Include="IBM.Data.DB2.Core" Version="3.1.0.400" Condition="'$(OS)' == 'WINDOWS_NT'"/>
<PackageReference Include="IBM.Data.DB2.Core-lnx" Version="3.1.0.400" Condition="'$(OS)' == 'UNIX'"/>
</ItemGroup>
</Project>
IndexModel
打开一个DB2连接并从数据库中获取一些数据(它是一个测试db,获取了2行数据)。
public class IndexModel : PageModel {
private readonly ILogger<IndexModel> _logger;
public List<Community> Communities { get; private set; }
public IndexModel(ILogger<IndexModel> logger) {
_logger = logger;
}
public void OnGet() {
String MyDb2ConnectionString = "Server=cnx-db2:50000;database=SNCOMM;uid=lcuser;pwd=xx;";
DB2Connection db = new DB2Connection(MyDb2ConnectionString);
db.Open();
Communities = db.Query<Community>(@"SELECT COMMUNITY_UUID as Uid, NAME, LOWER_NAME AS LowerName, DESCRIPTION FROM SNCOMM.COMMUNITY")
.ToList();
}
}
我认为崩溃与IBMs的DB2库有关,因为它是在第一个请求期间执行的(这个测试应用程序中还没有DI或其他东西,正如您在上面看到的,它是在执行GET请求时第一次初始化的)。
发布于 2021-02-23 19:02:46
我对IBM并不完全熟悉,但它很可能与Alpine不兼容,至少在您运行的特定版本中是如此。
由于您能够确认DB2本身存在分段错误(退出代码139表示发生了SIGSEGV
),所以很可能会出现这种情况。
Alpine是基于musl libc库的,而不是GNU库滑翔。libc库提供C标准库实现和POSIX API,因此它为大多数Linux程序提供动力,是Linux系统的一个基本部分。虽然musl的目标是维护与glibc的兼容性,但实际上存在许多兼容性问题,这将阻止在基于musl的发行版(如Alpine和Void )上运行的基于glibc的Linux发行版(如Ubuntu、Debian、RHEL)上编译的程序,在这种情况下它们是动态链接的。例如:默认的线程堆栈大小在musl上是128 is,而在glibc上是4MB --这很可能是复杂软件中分段错误的原因。还有许多其他微妙的差异,涵盖了这里。
通过谷歌搜索,我在Github问题项目中发现了以下数据库,其中一位项目成员发表了以下评论(确切日期是一年前,20/2/20):
node_db在Linux-x86-64上工作,这些映像包括amazonlinux、ubuntu和debian。它不能在高山上工作,因为IBM客户端安装程序不是使用Db2 libc在高寒linux上编译的。因此,Db2的IBM驱动程序没有一个能在高寒linux上工作。
这似乎证实,IBM目前确实不支持Alpine。
https://stackoverflow.com/questions/66285841
复制相似问题