skip to Main Content

I’m trying to containerize a .NET6 WebApi with a postgrescontainer. I have this Docker file to build the web api image:

#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"]

This runs successfully. But when i run docker-compose up to start the postgre and webapi container i get this error:

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.

My docker compose:

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:

I already tried to use other ms images like alpine and change the place of setting the env.

2

Answers


  1. Per the docs, you should set the environment variable to 1 to disable globalization. Like this

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

    Since you always need to set it to run your container, it’ll be a good idea to put the configuration into the image. You can put it at the beginning of the dockerfile and remove it from the docker-compose file

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

    That way you can’t forget to set it and have the error pop up again.

    Login or Signup to reply.
  2. I had a similar issue and got around it by adding this condition in the csproj

      <ItemGroup Condition="$([MSBuild]::IsOSPlatform('Windows'))">
        <RuntimeHostConfigurationOption Include="System.Globalization.AppLocalIcu" Value="68.2" />
      </ItemGroup>
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search