我正在使用下面的 dockerfile 运行我的应用程序,日期转换在容器内不起作用,但它可以在 Windows 和 ubuntu 上运行,这里是失败的代码示例:
var culture = new CultureInfo("en-GB");
Console.WriteLine(DateTime.TryParseExact("SEP24", "MMMyy", culture, DateTimeStyles.None, out var valueDate));
Console.WriteLine(valueDate);
它在其他系统上返回 true,但在容器内部它返回 false。
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build-env
WORKDIR /App
# Copy everything
COPY . ./
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
ENV DOTNET_RUNNING_IN_CONTAINER=true
RUN apk add --no-cache tzdata
RUN apk add --no-cache icu-data-full icu-libs
# just for exemple
RUN dotnet run
RUN dotnet restore
# Build and publish a release
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /App
RUN apt-get update -y && apt-get install -y tzdata
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]
我添加了tzdata,时区GB存在于容器中,但它没有解决问题。
您使用的是
System.Globalization
Nuget 软件包吗?
我尝试重现您的问题,但无法重现。我创建了以下独立的 Dockerfile(不安装
tzdata
),它创建一个控制台应用程序并添加您的代码。
当我构建并运行它时
docker build -t test .
docker run --rm test
打印出来了
True
09/01/2024 00:00:00
我的 Dockerfile:
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build-env
WORKDIR /App
# Create a console application and add System.Globalization Nuget package
RUN dotnet new console -n DotNet.Docker -o .
RUN dotnet add package System.Globalization --version 4.3.0
# Overwrite Program.cs with our own code
RUN cat <<EOF > Program.cs
using System.Globalization;
var culture = new CultureInfo("en-GB");
Console.WriteLine(DateTime.TryParseExact("SEP24", "MMMyy", culture, DateTimeStyles.None, out var valueDate));
Console.WriteLine(valueDate);
EOF
# Restore and build
RUN dotnet restore
RUN dotnet publish -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /App
COPY --from=build-env /App/out .
ENTRYPOINT ["dotnet", "DotNet.Docker.dll"]