Alpine 3.20(arm64) Docker容器中PowerShell无法加载libmi共享库求助
解决Alpine容器中PowerShell远程执行错误时libmi加载失败问题
问题背景
在arm64架构的MacBook Pro上,用Alpine 3.20镜像构建了包含PowerShell的Docker容器,镜像构建脚本如下:
FROM alpine:3.20 RUN apk update && \ apk add --no-cache \ openssh \ powershell
容器内pwsh命令可正常运行,通过SSH远程连接Windows Server也没问题,但当远程执行的命令触发错误时,容器会抛出libmi共享库加载失败的错误:
/ # pwsh -Command "& { Invoke-Command -HostName <username>@<ipaddress> -ScriptBlock { Add-DnsServerResourceRecordA -Name 'foo1' -ZoneName 'my.zone' -IPv4Address '10.1.0.101' } }" OperationStopped: Unable to load shared library 'libmi' or one of its dependencies. In order to help diagnose loading problems, consider using a tool like strace. If you're using glibc, consider setting the LD_DEBUG environment variable: Error loading shared library /usr/lib/powershell/libmi.so: No such file or directory Error loading shared library /usr/lib/dotnet/shared/Microsoft.NETCore.App/8.0.7/libmi.so: No such file or directory Error loading shared library libmi.so: No such file or directory Error loading shared library /usr/lib/powershell/liblibmi.so: No such file or directory Error loading shared library /usr/lib/dotnet/shared/Microsoft.NETCore.App/8.0.7/liblibmi.so: No such file or directory Error loading shared library liblibmi.so: No such file or directory Error loading shared library /usr/lib/powershell/libmi: No such file or directory Error loading shared library /usr/lib/dotnet/shared/Microsoft.NETCore.App/8.0.7/libmi: No such file or directory Error loading shared library libmi: No such file or directory Error loading shared library /usr/lib/powershell/liblibmi: No such file or directory Error loading shared library /usr/lib/dotnet/shared/Microsoft.NETCore.App/8.0.7/liblibmi: No such file or directory Error loading shared library liblibmi: No such file or directory
而直接在Windows Server上执行同一条命令,能得到预期的正确错误提示:
Add-DnsServerResourceRecordA: Failed to create resource record foo1 in zone my.zone on server domcon1.
解决办法
原因分析
Alpine Linux默认使用musl libc,而PowerShell的libmi库(用于Windows远程管理的MI接口)依赖glibc,因此在错误场景下,musl无法正确加载该库,导致Windows端的真实错误被覆盖。
方法1:给Alpine添加glibc兼容层
在Dockerfile中添加gcompat包,它能提供glibc的兼容支持,修改后的脚本:
FROM alpine:3.20 RUN apk update && \ apk add --no-cache \ openssh \ powershell \ gcompat
重新构建镜像后,再执行远程命令,就能正常获取Windows端返回的错误信息。
方法2:改用基于glibc的基础镜像
如果不想依赖兼容层,可以直接使用默认搭载glibc的发行版镜像(如Debian、Ubuntu),示例Dockerfile:
FROM debian:bookworm-slim RUN apt-get update && \ apt-get install -y --no-install-recommends \ openssh-client \ powershell && \ rm -rf /var/lib/apt/lists/*
这类镜像的PowerShell环境依赖更完善,不会出现libmi加载问题。
验证
构建新镜像后,执行测试命令:
pwsh -Command "& { Invoke-Command -HostName <username>@<ipaddress> -ScriptBlock { Add-DnsServerResourceRecordA -Name 'foo1' -ZoneName 'my.zone' -IPv4Address '10.1.0.101' } }"
此时应该能正常返回Windows端的错误提示:
Add-DnsServerResourceRecordA: Failed to create resource record foo1 in zone my.zone on server domcon1.
内容的提问来源于stack exchange,提问作者Pieter Vogelaar
相关产品推荐
相关产品推荐

