skip to Main Content

I have .NET API, which works perfectly on local machine, and on target machine container run from local build works too. But when i try to run container from azure devops CI and azure container repo, swagger starts normally but calling any endpoint throws exception, calling from app throws it too.

If there always be fail, error System.Globalization.CultureNotFoundException will be starting point for looking solution but from local build it works.
Any ideas where might be problem?

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 5002
EXPOSE 5206
EXPOSE 7208

FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build
WORKDIR /src
COPY ["HealthCheck.API/HealthCheck.API.csproj", "HealthCheck.API/"]
RUN dotnet restore "HealthCheck.API/HealthCheck.API.csproj"
COPY . .
WORKDIR "/src/HealthCheck.API"
RUN dotnet build "HealthCheck.API.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "HealthCheck.API.csproj" -c Release -o /app/publish /p:UseAppHost=false

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

azure-pipeline.yml

trigger:
- master

resources:
- repo: self

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: 'xxxxxxxx'
  imageRepository: 'healthcheck'
  containerRegistry: 'xxxxxx'
  dockerfilePath: '$(Build.SourcesDirectory)/HealthCheck/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: BuildDocker
  displayName: Build and push stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: 'ubuntu-latest'
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)
          latest

Info from console:

info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://192.168.10.17:5216/api/Zdarzenie/?typZdarzenia=-1 - -
info: Microsoft.AspNetCore.Cors.Infrastructure.CorsService[4]
      CORS policy execution successful.
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'HTTP: GET api/Zdarzenie'
fail: Microsoft.EntityFrameworkCore.Database.Connection[20004]
      An error occurred using the connection to database 'HealthCheck' on server 'xxxxxxxxxxx'.
fail: Microsoft.EntityFrameworkCore.Query[10100]
      An exception occurred while iterating over the results of a query for context type 'HealthCheck.Core.Data.ApplicationDbContext'.
      System.Globalization.CultureNotFoundException: 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.
         at System.Globalization.CultureInfo.GetCultureInfo(String name)
         at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
         at Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides overrides)
         at Microsoft.Data.SqlClient.SqlConnection.Open()
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.OpenDbConnection(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.<>c.<MoveNext>b__21_0(DbContext _, Enumerator enumerator)
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
      System.Globalization.CultureNotFoundException: 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.
         at System.Globalization.CultureInfo.GetCultureInfo(String name)
         at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
         at Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides overrides)
         at Microsoft.Data.SqlClient.SqlConnection.Open()
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.OpenDbConnection(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.<>c.<MoveNext>b__21_0(DbContext _, Enumerator enumerator)
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'HTTP: GET api/Zdarzenie'
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HMVLD3R0RJ88", Request id "0HMVLD3R0RJ88:00000002": An unhandled exception was thrown by the application.
      System.Globalization.CultureNotFoundException: 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.
         at System.Globalization.CultureInfo.GetCultureInfo(String name)
         at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry, SqlConnectionOverrides overrides)
         at Microsoft.Data.SqlClient.SqlConnection.Open(SqlConnectionOverrides overrides)
         at Microsoft.Data.SqlClient.SqlConnection.Open()
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerConnection.OpenDbConnection(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
         at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.InitializeReader(Enumerator enumerator)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.<>c.<MoveNext>b__21_0(DbContext _, Enumerator enumerator)
         at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
         at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.Enumerator.MoveNext()
         at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
         at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
         at HealthCheck.Core.Data.Repositories.ZdarzenieRepository.GetAllWithTyp(Int32 typZdarzenia, Int32 count) in /src/HealthCheck.Core/Data/Repositories/ZdarzenieRepository.cs:line 35
         at HealthCheck.API.Endpoints.ZdarzenieEndpoint.<>c.<MapZdarzenieEndpoint>b__0_0(Int32 typZdarzenia, Nullable`1 idAplikacja, IUnitOfWork unitOfWork, IMapper mapper) in /src/HealthCheck.API/Endpoints/ZdarzenieEndpoint.cs:line 20
         at lambda_method10(Closure, Object, HttpContext)
         at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
      --- End of stack trace from previous location ---
         at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
         at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
         at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
      Request finished HTTP/1.1 GET http://192.168.10.17:5216/api/Zdarzenie/?typZdarzenia=-1 - - - 500 0 - 2.3359ms

2

Answers


  1. Chosen as BEST ANSWER

    Still don't know what cause difference, but adding to csproj:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <InvariantGlobalization>false</InvariantGlobalization>
        . . .
      </PropertyGroup>
      . . .
    </Project>
    

    And modifying dockerfile works

    FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS base
    WORKDIR /app
    RUN apk add --no-cache icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib tzdata
    ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
    EXPOSE 80
    EXPOSE 443
    EXPOSE 5002
    EXPOSE 5206
    EXPOSE 7208
    
    FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build
    WORKDIR /src
    COPY ["HealthCheck.API/HealthCheck.API.csproj", "HealthCheck.API/"]
    RUN dotnet restore "HealthCheck.API/HealthCheck.API.csproj"
    COPY . .
    WORKDIR "/src/HealthCheck.API"
    RUN dotnet build "HealthCheck.API.csproj" -c Release -o /app/build
    
    FROM build AS publish
    RUN dotnet publish "HealthCheck.API.csproj" -c Release -o /app/publish /p:UseAppHost=false
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app/publish .
    ENTRYPOINT ["dotnet", "HealthCheck.API.dll"]
    

    Invariant=false cause chain of next exceptions so had to add line:

    RUN apk add --no-cache icu-libs krb5-libs libgcc libintl libssl1.1 libstdc++ zlib tzdata
    

  2. You can try to one of the following ways to fix the issue:

    1. Update your Dockerfile like as below.

      FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS base
      WORKDIR /app
      ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
      . . .
      
    2. Add below property in your project file (.csproj).

      <Project Sdk="Microsoft.NET.Sdk">
        <PropertyGroup>
          <InvariantGlobalization>false</InvariantGlobalization>
          . . .
        </PropertyGroup>
        . . .
      </Project>
      

    For more details, see "Runtime configuration options for globalization".

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search