在Dockerfile中公开具有不同名称的环境变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Dockerfile中公开具有不同名称的环境变量相关的知识,希望对你有一定的参考价值。

我正在为包含基于ASP.NET Core 2.2的应用程序的容器创建Dockerfile。

要通过.NET配置系统利用环境变量,我必须使用某种格式,但这会使环境变量非常难看。

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY src/ ./
RUN dotnet publish App/App.csproj -c Release -o /out

FROM microsoft/dotnet:2.2-runtime AS runtime
WORKDIR /app
COPY --from=build  /out ./
ENV NYBUS_ENVIRONMENT=Production

ENV NYBUS_LOGGLY__APIKEY=loggly \
    NYBUS_Nybus__RabbitMq__Connection__Hostname=host.docker.internal \
    NYBUS_Nybus__RabbitMq__Connection__Username=guest \
    NYBUS_Nybus__RabbitMq__Connection__Password=guest \
    NYBUS_Nybus__RabbitMq__UnackedMessageCountLimit=

ENTRYPOINT [ "dotnet", "App.dll" ]

我试图使用参数,但它们似乎不起作用

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY src/ ./
RUN dotnet publish App/App.csproj -c Release -o /out

FROM microsoft/dotnet:2.2-runtime AS runtime
WORKDIR /app
COPY --from=build  /out ./
ENV NYBUS_ENVIRONMENT=Production

ENV LOGGLY_APIKEY=loggly \
    RABBITMQ_HOSTNAME=host.docker.internal \
    RABBITMQ_USERNAME=guest \
    RABBITMQ_PASSWORD=guest \
    RABBITMQ_MESSAGE_LIMIT=

ENV NYBUS_LOGGLY__APIKEY=$LOGGLY_APIKEY \
    NYBUS_Nybus__RabbitMq__Connection__Hostname=$RABBITMQ_HOSTNAME \
    NYBUS_Nybus__RabbitMq__Connection__Username=$RABBITMQ_USERNAME \
    NYBUS_Nybus__RabbitMq__Connection__Password=$RABBITMQ_PASSWORD \
    NYBUS_Nybus__RabbitMq__UnackedMessageCountLimit=$RABBITMQ_MESSAGE_LIMIT

ENTRYPOINT [ "dotnet", "App.dll" ]

有什么建议吗?

答案

您遇到的问题是因为ENV仅在构建时进行评估,而不是在运行时重新评估。因此,如果重新配置“LOGGLY_APIKEY”ENV变量,则在启动映像时它不会发生变化。

如果要在运行时评估和复制它们,可以使用shell脚本包装器。创建一个start.cmd,在构建时复制它,然后更改入口点以使用start.cmd文件作为第一个参数。

set NYBUS_Nybus__RabbitMq__Connection__Hostname=%RABBITMQ_HOSTNAME%
.... Other set values ....
shift
start %*

您的dockerfile将具有以下入口点:

ENTRYPOINT [ "start.cmd", "dotnet", "App.dll" ]
另一答案

对于短名称,请尝试使用ARG而不是ENV。

以上是关于在Dockerfile中公开具有不同名称的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

Powershell Array Strings - 在 SSIS 中映射不同的变量参数名称

在具有不同变量名称的循环中保存

环境变量未在 dockerfile 中提取

在 Dockerfile 中使用环境变量

在 Dockerfile 中,如何更新 PATH 环境变量?

如何在 C 中取消设置变量以允许稍后使用具有不同数据类型的相同名称?