【问题标题】:Expose environment variables with different name in Dockerfile在 Dockerfile 中公开具有不同名称的环境变量
【发布时间】:2019-07-20 07:53:16
【问题描述】:

我正在为将包含基于 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" ]

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    您遇到的问题是因为 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" ]
    

    【讨论】:

    • 当我在 Windows 上运行容器时它可以工作,现在我必须翻译它以便它在 Linux 容器中运行!但非常感谢:D
    • 这是相同的方法,但你创建了一个 start.sh。确保您“chmod 777 start.sh”。我将编辑答案以添加 bash 脚本。
    【解决方案2】:

    尝试使用 ARG 而不是 ENV 作为短名称。

    【讨论】:

    • ARG 不是用于构建参数吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多