Docker for Windows:ASP.NET站点无法读取Dockerfile

时间:2016-10-11 13:25:52

标签: asp.net windows docker

我有一个在windows docker容器中运行的ASP.NET站点。 我希望能够读取Dockerfile中定义的环境变量。 (当盯着容器时。)

我无法使其发挥作用:

Repro:

  • 安装和配置使用Windows容器所需的软件。

  • 创建一个新的(空)文件夹。

  • 在新文件夹中创建两个文件(Dockerfile和default.aspx),其内容如下所示。

  • 导航到空文件夹并运行docker build -t test .(这将创建一个名为test的容器图像

  • 在交互式容器中启动PowerShell:docker run -it --rm -e FROM_COMMAND_LINE="From command line" --entrypoint powershell test

现在,您将进入容器内的PowerShell提示符。您现在可以通过获取网页来验证Web站点中的环境变量是否不可用:

$(wget http://localhost/default.aspx -UseBasicParsing).Content

结果摘录:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables
COMPUTERNAME - 540CA54CDB93<br>
PUBLIC - C:\Users\Public<br>
LOCALAPPDATA - C:\Windows\system32\config\systemprofile\AppData\Local<br>
...
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables - Process
COMPUTERNAME - 540CA54CDB93<br>
PUBLIC - C:\Users\Public<br>
LOCALAPPDATA - C:\Windows\system32\config\systemprofile\AppData\Local<br>
...
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables - User
Path - C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps;<br>
TEMP - C:\Windows\system32\config\systemprofile\AppData\Local\Temp<br>
TMP - C:\Windows\system32\config\systemprofile\AppData\Local\Temp<br>

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables - Machine
PROCESSOR_REVISION - 3f02<br>
...

请注意,缺少FROM_COMMAND_LINE和FROM_DOCKERFILE。

在powershell控制台中,您可以验证变量是否缺失:

PS C:\> $env:FROM_COMMAND_LINE
From command line
PS C:\> $env:FROM_DOCKERFILE
Value from dockerfile

我还测试过做iisreset,但它不会改变行为。

  1. 我做错了什么吗?

  2. 还有其他方法可以指定 环境变量,使其可供iis内部使用 容器?

  3. Dockerfile:

    FROM microsoft/aspnet
    ENV FROM_DOCKERFILE Value from dockerfile
    
    ADD default.aspx c:/inetpub/wwwroot/default.aspx
    

    的Default.aspx:

    <% @ Page Language="C#" Trace="false"%>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables
    <%
    foreach (DictionaryEntry de in Environment.GetEnvironmentVariables()) {
        Response.Write(string.Format("{0} - {1}<br>\n", de.Key, de.Value));
    }
    %>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables - Process
    <%
    foreach (DictionaryEntry de in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process)) {
        Response.Write(string.Format("{0} - {1}<br>\n", de.Key, de.Value));
    }
    %>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables - User
    <%
    foreach (DictionaryEntry de in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User)) {
        Response.Write(string.Format("{0} - {1}<br>\n", de.Key, de.Value));
    }
    %>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx GetEnvironmentVariables - Machine
    <%
    foreach (DictionaryEntry de in Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine)) {
        Response.Write(string.Format("{0} - {1}<br>\n", de.Key, de.Value));
    }
    %>
    

    注意:我目前正在使用Docker版本1.12.2-rc1-beta27.1(版本:7538)a0eb77a

2 个答案:

答案 0 :(得分:5)

通过CreateProcess and lpEnvironment.

为容器中的流程设置传递到docker-e的环境变量

它们未被设置为系统变量,它们将驻留在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment配置单元的注册表中,因此即使您运行w3wp.exeiisreset也不会接收更改。

您可以在此处找到几种解决方法:

  • 您可以通过在Dockerfile中运行RUN setx /m VAR val来创建SYSTEM变量。运行iisreset
  • 后,您的IIS工作进程将选择此选项
  • 仅为该AppPool创建环境变量。 RUN appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='DefaultAppPool'].environmentVariables.[name='VAR',value='val']" /commit:apphost

答案 1 :(得分:3)

现在有更好的选择。基本上,如果您将docker基于microsoft/aspnet,它将包含最新的“ServiceMonitor.exe”,它将为本地进程注入的环境变量注入IIS AppPool。它可以立即访问,无需重新启动IIS进程。

然而,有一个hack,应用程序池必须是“DefaultAppPool”,因此您无法创建自定义应用程序池,这对于更多部署应该没问题。

您可以详细了解此更新here