ubuntu 无法加载模块:Favicon到这里去看看!

hgqdbh6s  于 2023-06-29  发布在  其他
关注(0)|答案(2)|浏览(112)

队员们
当我尝试在docker上运行时,出现以下错误。它在Windows机器上工作正常-
无法加载共享库“Tongshan”或它的某一个依赖项。为了帮助诊断加载问题,请考虑设置LD_DEBUG环境变量:liblibldap-2.4.so.2:无法打开共享对象文件:没有这样的文件或目录
我正在使用LdapConnection的System.DirectoryServices.Protocols命名空间。我尝试在我的docker镜像中安装libldap。用了三种方法但都不管用。

RUN apt-get update && apt-get install libldap-2.4-2

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        libldap-2.4-2 \
    && rm -rf /var/lib/apt/lists/*

RUN apk add libldap

这是我的docker文件

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        libldap-2.4-2 \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /src
COPY ["Ldaptest1/Ldaptest1.csproj", "Ldaptest1/"]
RUN dotnet restore "Ldaptest1/Ldaptest1.csproj"
COPY . .
WORKDIR "/src/Ldaptest1"
RUN dotnet build "Ldaptest1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Ldaptest1.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Ldaptest1.dll"]

我目前正在使用.NET 6,当初始化LdapConnection时,它在以下行中中断-

var connection = new LdapConnection(ldapDomain)

我已经经历了这个-https://github.com/dotnet/dotnet-docker/issues/1946。但这并没有帮助。
先谢了

dddzy1tm

dddzy1tm1#

将安装命令移到最后一个FROM之后,这样应该可以修复它。
我不得不为.NET Core 5映像这样做,并且它工作了。

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["Ldaptest1/Ldaptest1.csproj", "Ldaptest1/"]
RUN dotnet restore "Ldaptest1/Ldaptest1.csproj"
COPY . .
WORKDIR "/src/Ldaptest1"
RUN dotnet build "Ldaptest1.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Ldaptest1.csproj" -c Release -o /app/publish

FROM base AS final
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        libldap-2.4-2 \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Ldaptest1.dll"]
csga3l58

csga3l582#

我认为这是充分相关的:在我写这篇文章的时候,System.DirectoryServices.Protocols 的最新版本是8.0.0-preview.5.23280.8,当它在Linux上运行时,例如当它在Docker容器中运行时,它仍然被硬编码为严格查找 libldap-2.4.so.2
这可能是一个问题,因为libldap-2.4.so.2不支持TLS/SSL。一位用户说:“在Linux上,我不能设置LdapConnection.SessionOptions.VerifyServerCertificate(甚至是一个简单的“=>true”处理程序)。我假设这是因为不支持LDAP_OPT_SSL。”用户引用了一个开发人员的帖子,他说:

必须安装较新版本的libldap(例如,libldap-2.5.so.0)才能使用TLS/SSL。如果Dockerfile使用的镜像可以访问2.4以上的libldap版本,则可以以相同的方式下载它。例如:

FROM mcr.microsoft.com/dotnet/aspnet:8.0-preview AS base
...

FROM base AS final
RUN apt-get update && \
    apt-get install -y --no-install-recommends libldap-2.5 && \
    apt-get install -y --no-install-recommends libldap-common && \
    rm -rf /var/lib/apt/lists/*

如果System.DirectoryServices.Protocols在Linux上运行时(至少目前)被硬编码为严格查找libldap-2.4.so.2,则必须实现下面的一种解决方法。第一个解决方案对我不起作用,但是第二个解决方案起作用了。我提到这两个,以防第一个可能为其他人工作。

解决方法1(参见此和此链接)-在Dockerfile中添加以下符号链接:

RUN ln -s path-to-the-newer-ldap-version-you-have-installed/libldap-2.5.so.0 path-where-the-program-error-says-it-is-looking-for-version-2.4/libldap-2.4.so.2

要查找新版本的安装位置,请使用以下命令浏览docker容器:

docker exec -it your-container-name /bin/bash

它可能会安装在 /usr/lib/x86_64-linux-gnu 中,您可以使用以下命令导航到该位置:

cd /usr/lib/x86_64-linux-gnu

解决方法2 -将以下内容添加到C#代码中:

if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
    AssemblyLoadContext.Default.ResolvingUnmanagedDll += (assembly, libraryName) =>
    {
        if (libraryName.Equals("libldap-2.4.so.2"))
        {
            try
            {
                return NativeLibrary.Load("/usr/lib/x86_64-linux-gnu/libldap-2.5.so.0");
            }
            catch (Exception)
            {
                throw;
            }
        }

        return IntPtr.Zero;
    };
}

相关问题