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

标签 c# docker .net-core environment-variables dockerfile

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

为了通过.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仅在构建时评估,而在运行时未重新评估。因此,如果您重新配置ENV变量“LOGGLY_APIKEY”,则在启动镜像时它将不会更改。

如果要在运行时评估和复制它们,则可以使用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" ]

关于c# - 在Dockerfile中公开具有不同名称的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54891135/

相关文章:

c# - 在没有 DI 的情况下获取 Serilog 记录器的实例

linux - 安排每日 Docker 容器重启/重置

c# - 如何在单元测试方法中模拟返回 IEnumerable<T> 的方法?

c# - 使用通过 Azure MSI 获取的 token 从 TokenCredential 创建 Azure CloudStorageAccount

c# - 如何从 C# 中确定性地处理托管 C++/CLI 对象?

c# - 从类继承时编译错误

c# - 将内连接 sql 查询转换为 linq

docker - 使用 docker 获得 websphere 自由有什么好处?

amazon-web-services - aws ecs 优化 AMI 中的私有(private) docker 注册表身份验证不成功

entity-framework - Entity Framework 添加迁移失败,出现 "Could not find assembly"