首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.NET6和docker:找不到系统上安装的有效的ICU包

.NET6和docker:找不到系统上安装的有效的ICU包
EN

Stack Overflow用户
提问于 2022-06-07 19:59:38
回答 2查看 868关注 0票数 0

我正在尝试用Postgres容器来封装一个.NET6 WebApi。我有这个Docker文件来构建web映像:

代码语言:javascript
运行
复制
#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"]

成功地运行了。但是,当我在启动postgre和webapi容器时运行docker-组合时,我会得到以下错误:

代码语言:javascript
运行
复制
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.

我的码头工:

代码语言:javascript
运行
复制
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图像,比如高山,并更改设置env的位置。

EN

回答 2

Stack Overflow用户

发布于 2022-06-07 20:11:08

按照医生们,您应该将环境变量设置为1以禁用全球化。像这样

代码语言:javascript
运行
复制
environment:
    - ConnectionStrings:Context=Server=MicroserviceTemplateDDD_Service1_database;Database=Database;User Id=pa;Password=P4ssW0rd!;
    - DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1

因为您总是需要设置它来运行您的容器,所以将配置放到映像中是个好主意。您可以将它放在dockerfile的开头,然后从docker-组合文件中删除它。

代码语言:javascript
运行
复制
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1
WORKDIR /app
EXPOSE 80
EXPOSE 443

这样,您就不能忘记设置它,并再次弹出错误。

票数 1
EN

Stack Overflow用户

发布于 2022-07-28 11:11:03

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

代码语言:javascript
运行
复制
  <ItemGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
    <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="68.2" />
  </ItemGroup>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72536918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档