首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在码头阿尔卑斯映像上运行时,具有DB2的DB2内核在第一次请求时随代码139退出

在码头阿尔卑斯映像上运行时,具有DB2的DB2内核在第一次请求时随代码139退出
EN

Stack Overflow用户
提问于 2021-02-19 22:29:59
回答 1查看 302关注 0票数 1

我正在构建一个ASP.NET Core3.1应用程序,它使用IBM.Data.DB2.Core-lnx访问遗留应用程序的DB。它在使用普通Debian图像时工作。但是我想用阿尔卑斯山来代替小图片。关于丢失文件,我犯了一些错误:

加载共享库libpan.so.0时出错:没有这样的文件或目录(/app/clidriver/lib/liblebdb2.so需要)

使用内容搜索,我找到了包含它们的阿尔卑斯包。但是这个应用程序显示出一种奇怪的行为:它启动并运行,直到我在浏览器中打开它的网站。打开它后,容器将退出,其中包含错误代码139,没有消息:

代码语言:javascript
运行
复制
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来手动启动该应用程序。

代码语言:javascript
运行
复制
/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:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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模板有两个包

代码语言:javascript
运行
复制
  <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行数据)。

代码语言:javascript
运行
复制
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请求时第一次初始化的)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66285841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档