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,但是它不会改变行为。
-
我做错了什么?
-
有没有其他的方法来指定环境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是通过CreateProcess
和lpEnvironment
为容器中的进程设置的。
它们没有设置为系统variables,这些variables驻留在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
configuration单元的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自定义应用程序池,这应该是更好的部署。
你可以在这里阅读更多关于这个更新。