我正在为一个容器创建一个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/