队员们
当我尝试在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。但这并没有帮助。
先谢了
2条答案
按热度按时间dddzy1tm1#
将安装命令移到最后一个FROM之后,这样应该可以修复它。
我不得不为.NET Core 5映像这样做,并且它工作了。
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版本,则可以以相同的方式下载它。例如:
如果System.DirectoryServices.Protocols在Linux上运行时(至少目前)被硬编码为严格查找libldap-2.4.so.2,则必须实现下面的一种解决方法。第一个解决方案对我不起作用,但是第二个解决方案起作用了。我提到这两个,以防第一个可能为其他人工作。
解决方法1(参见此和此链接)-在Dockerfile中添加以下符号链接:
要查找新版本的安装位置,请使用以下命令浏览docker容器:
它可能会安装在 /usr/lib/x86_64-linux-gnu 中,您可以使用以下命令导航到该位置:
解决方法2 -将以下内容添加到C#代码中: