【问题标题】:asp.net core Dockerfile Environment variableasp.net core Dockerfile 环境变量
【发布时间】:2022-11-16 21:26:57
【问题描述】:

我在 docker 图像上设置 HostingEnvironment 时遇到问题。

当我采用这种方法时,它不起作用,它只是将环境设置为 $ENVIRONMENT

Is Development False
Is Test False
Is Production False

info: Microsoft.Hosting.Lifetime\[0\]
Hosting environment: echo $ENVIRONMENT
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY \["src/Customer.Console/Customer.Console.csproj", "src/Customer.Console/"\]
COPY \["src/Contracts/Contracts.csproj", "src/Contracts/"\]
COPY \["src/Application/Application.csproj", "src/Application/"\]
RUN --mount=type=secret,id=GH_PAT,dst=/GH_PAT \
dotnet nuget add source --username \_ --password `cat /GH_PAT` --store-password-in-clear-text --name github "https://nuget.pkg.github.com/owner/index.json"
RUN dotnet restore "src/Customer.Console/Customer.Console.csproj"
COPY . .
WORKDIR "/src/src/Customer.Console"
RUN dotnet build "Customer.Console.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

ARG ENVIRONMENT
ENV ENVIRONMENT=$ENVIRONMENT
RUN export ASPNETCORE_ENVIRONMENT=$ENVIRONMENT
ENTRYPOINT \["dotnet", "LabelAPI.CustomerConsumer.Console.dll","--environment","$ENVIRONMENT"\]

选项 2 我只是在它实际工作的地方输入 Entrypoint 命令,但随后容器因依赖注入而崩溃。

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY \["src/Customer.Console/Customer.Console.csproj", "src/Customer.Console/"\]
COPY \["src/Contracts/Contracts.csproj", "src/Contracts/"\]
COPY \["src/Application/Application.csproj", "src/Application/"\]
RUN --mount=type=secret,id=GH_PAT,dst=/GH_PAT \
dotnet nuget add source --username \_ --password `cat /GH_PAT` --store-password-in-clear-text --name github "https://nuget.pkg.github.com/owner/index.json"
RUN dotnet restore "src/Customer.Console/Customer.Console.csproj"
COPY . .
WORKDIR "/src/src/Customer.Console"
RUN dotnet build "Customer.Console.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

ARG ENVIRONMENT
ENV ENVIRONMENT=$ENVIRONMENT
RUN export ASPNETCORE_ENVIRONMENT=$ENVIRONMENT

ENTRYPOINT dotnet LabelAPI.CustomerConsumer.Console.dll --environment $ENVIRONMENT
Is Development True 
Is Test False 
Is Production False

Unhandled exception. System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: MediatR.IRequestHandler2[Application.Features.RoutingDataFeatures.Queries.Query.GetRoutingDataFromDatabaseRequest,Domain.Models.RoutingData] Lifetime: Transient ImplementationType: LabelAPI.Application.Features.RoutingDataFeatures.Handlers.Query.GetRoutingDataFromDatabaseRequestHandler': Unable to resolve service for type 'Common.Interfaces.IMongoRepository1[Domain.Models.RoutingData]' while attempting to activate 'Application.Features.RoutingDataFeatures.Handlers.Query.GetRoutingDataFromDatabaseRequestHandler'.)

是否可以将它与 ENTRYPOINT ["dotnet", "LabelAPI.CustomerConsumer.Console.dll","--environment","$ENVIRONMENT"] 一起使用

【问题讨论】:

  • RUN export ... 不执行任何操作,因为每个 RUN 语句都在单独的 shell 中运行。所以当RUN语句结束时,导出的变量就丢失了。您应该使用ENV 来设置环境变量。

标签: docker asp.net-core


【解决方案1】:

您必须阅读此内容才能了解 ARG 和 ENV 的区别: https://vsupalov.com/docker-arg-env-variable-guide/

使用 ARG,您可以定义变量,其作用域是直到构建图像,但当您基于构建的图像启动容器时,它不会出现在运行时。您也可以将 ARG-s 传递给 docker build:docker build --build-arg MYVAR=MYVALUE 假设您已经在 Dockerfile 中使用 ARG MYVAR 定义了 MYVAR

使用 ENV,您可以拥有构建时和运行时都存在的变量,但您不能将 ENV 传递给 docker build,而是需要从 ARG 中提供 ENV 的值,如下所示:

文件:

ARG MYVAR
ENV MYVAR=$MYVAR

码头工人运行: docker build --build-arg MYVAR=MYVALUE ...

这样,当您从此图像启动容器时,您将拥有一个具有 MYVALUE 值的 MYVAR 变量。

但是,在这里您应该在启动容器时设置此变量,而不是在 Dockerfile 中预先定义它。您可以使用 -e 标志将任何环境变量传递给 docker run

docker run -e ASPNETCORE_ENVIRONMENT=Development -e MYOTHERVAR=MYVALUE ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多