【问题标题】:.NET6 and docker: Couldn't find a valid ICU package installed on the system.NET6 和 docker:找不到系统上安装的有效 ICU 包
【发布时间】:2022-07-28 19:11:03
【问题描述】:

我正在尝试使用 postgrescontainer 将 .NET6 WebApi 容器化。我有这个 Docker 文件来构建 web api 映像:

#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 ["MicroserviceTemplateDDD.csproj", "MicroserviceTemplateDDD/"]
RUN dotnet restore "MicroserviceTemplateDDD/MicroserviceTemplateDDD.csproj"
WORKDIR "/src/MicroserviceTemplateDDD"
COPY . .
RUN dotnet build "MicroserviceTemplateDDD.csproj" -c Release -o /app/build

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

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

这运行成功。但是当我运行 docker-compose up 来启动 postgre 和 webapi 容器时,我得到了这个错误:

microservicetemplateddd_service1 | Process terminated. Couldn't find a valid ICU package installed on the system. Please install libicu using your package manager and try again. Alternatively you can set the configuration flag System.Globalization.Invariant to true if you want to run with no globalization support. Please see https://aka.ms/dotnet-missing-libicu for more information.

我的码头工人撰写:

version: "3.7"
services:
    api:
        image:  microservicetemplateddd_service1
        container_name:  microservicetemplateddd_service1
        restart: always
        build:
            context: .
            dockerfile: Dockerfile
        environment:
            - ConnectionStrings:Context=Server=MicroserviceTemplateDDD_Service1_database;Database=Database;User Id=pa;Password=P4ssW0rd!;
            - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
        depends_on:
            - database
        networks:
            - network
        ports:
            - 8090:80
    database:
        image: postgres
        container_name: microservicetemplateddd_service1_database
        restart: always
        environment:
            - ACCEPT_EULA=Y
            - POSTGRES_PASSWORD=P4ssW0rd!
            - POSTGRES_USER=pa
        networks:
            - network
        ports:
            - 1433:1433
        volumes:
            - database:/var/opt/mssql

networks:
    network:
volumes:
    database:

我已经尝试使用其他 ms 图像,例如 alpine,并更改了设置环境的位置。

【问题讨论】:

    标签: docker .net-core docker-compose


    【解决方案1】:

    根据the docs,您应该将环境变量设置为1 以禁用全球化。像这样

    environment:
        - ConnectionStrings:Context=Server=MicroserviceTemplateDDD_Service1_database;Database=Database;User Id=pa;Password=P4ssW0rd!;
        - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
    

    由于您始终需要对其进行设置以运行您的容器,因此最好将配置放入映像中。你可以把它放在dockerfile的开头,然后从docker-compose文件中删除

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

    这样你就不会忘记设置它并再次弹出错误。

    【讨论】:

    • 感谢您的回答!从 compose 中删除 DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1 对我不起作用。现在我的 Appsettings 出现 FileNotFound 异常......“预期的物理路径是'/app/AppSettings.json'”似乎我的复制目录有问题。 appsettings.json 与我的 dockerfile 路径相同
    • Linux 区分大小写,所以如果你尝试加载AppSettings.json(而不是默认的appsettings.json),那么你的文件也需要调用AppSettings.json
    • 仍然出现错误。有没有办法“检查” docker 图像以查看文件夹结构?
    • 我在一个新问题中发布了这个问题,也许你也知道这个答案stackoverflow.com/questions/72545834/…
    【解决方案2】:

    我有一个类似的问题,并通过在 csproj 中添加这个条件来解决它

      <ItemGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
        <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="68.2" />
      </ItemGroup>
    

    【讨论】:

      猜你喜欢
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多