错误提示

The type initializer for 'OBS.Internal.Constants' threw an exception.

Only the invariant culture is supported in globalization-invariant mode. See https://aka.ms/GlobalizationInvariantMode for more information. (Parameter 'name')

en-us is an invalid culture identifier.

问题分析与解决方案

核心问题定位

从错误信息和搜索结果分析,问题的本质是:

Alpine Linux 镜像默认缺少 ICU 全球化库,而 .NET 10 在全球化不变模式(默认启用)下不支持 en-us 等特定文化标识符,导致 OBS SDK 初始化时抛出异常。

针对性解决方案

方案一:安装 ICU 库并禁用不变模式(推荐)

这是最彻底的解决方案,能完整支持全球化功能:

# 使用官方 .NET 10 Alpine 镜像
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS base

# 安装 ICU 全球化库(Alpine 专用包)
RUN apk add --no-cache icu-libs

# 禁用全球化不变模式,启用完整文化支持
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
# 设置默认文化(可选,根据需要调整)
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8

# 复制应用程序文件
WORKDIR /app
COPY . .

# 启动应用
ENTRYPOINT ["dotnet", "YourApp.dll"]

方案二:仅禁用不变模式(无需额外安装)

如果不需要完整全球化支持,仅需禁用不变模式即可解决 en-us 文化错误:

FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine AS base

# 直接禁用全球化不变模式
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false

WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "YourApp.dll"]

方案三:代码层面修复(无需修改容器配置)

如果无法修改 Dockerfile,可在代码中强制使用不变文化:

using System.Globalization;

var builder = WebApplication.CreateBuilder(args);

// 在应用启动时设置全局默认文化
CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

// 其他配置...

var app = builder.Build();
// ...

验证与测试

部署后可通过以下命令验证配置是否生效:

# 进入容器
docker exec -it <container-id> sh

# 检查环境变量
echo $DOTNET_SYSTEM_GLOBALIZATION_INVARIANT
echo $LC_ALL

# 验证 .NET 全球化状态
dotnet --info | grep "Globalization"

关键注意事项

⚠️ 性能与体积提示:安装 ICU 库会使镜像体积增加约 20MB,但能提供完整的全球化支持仅禁用不变模式不会增加镜像体积,但可能影响部分全球化功能的性能Alpine 镜像使用 musl 库而非 glibc,部分原生库可能存在兼容性问题

下一步行动

  1. 将上述 Dockerfile 配置应用到你的项目中
  2. 重新构建并部署 Docker 镜像
  3. 测试 OBS SDK 功能是否正常工作