Docker for Windows:ASP.NET站点无法读取在Dockerfile中定义的环境variables

我有一个ASP.NET网站在Windows泊坞窗容器中运行。 我希望能够读取在Dockerfile中定义的环境variables。 (当凝视容器时)

我无法使其工作:

摄制:

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

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

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

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

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

您现在将在容器内的一个PowerShell提示。 您现在可以通过获取网页来validation环境variables在网站中不可用:

 $(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控制台中,您可以validationvariables不会丢失:

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

我也testing过做一个iisreset,但是它不会改变行为。

  1. 我做错了什么?

  2. 有没有其他的方法来指定环境variables,使它们可以在容器内的iis?


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(build:7538)a0eb77a

通过-e传递给lpEnvironment环境variables是通过CreateProcesslpEnvironment为容器中的进程设置的。

它们没有设置为系统variables,这些variables驻留在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environmentconfiguration单元的registry中,因此,即使运行iisreset w3wp.exe也不会收到更改。

您在这里有几个解决方法选项:

  • 您可以通过在RUN setx /m VAR val运行RUN setx /m VAR val来创build一个SYSTEMvariables。 运行iisreset后,这将由您的IIS工作进程select。
  • 仅为该AppPool创build一个环境variables。 RUN appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='DefaultAppPool'].environmentVariables.[name='VAR',value='val']" /commit:apphost

现在有更好的select。 基本上,如果你基于微软/ aspnetdocker,它将包括最新的“ServiceMonitor.exe”这将注入为本地进程定义的环境variables到IIS AppPool。 它将立即可以访问,而无需重新启动IIS进程。

然而,有一个窍门,应用程序池必须是“DefaultAppPool”,所以你不能创build自定义应用程序池,这应该是更好的部署。

你可以在这里阅读更多关于这个更新。