Windows的Docker:ASP.NET站点无法读取Dockerfile中定义的环境变量

Ste*_*and 1 windows asp.net docker

我有一个在Windows docker容器中运行的ASP.NET站点。我希望能够读取Dockerfile中定义的环境变量。(以及凝视容器时。)

我无法使其工作:

复制:

  • 安装和配置使用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提示符中。现在,您可以通过获取网页来验证环境变量在网站中不可用:

$(wget http://localhost/default.aspx -UseBasicParsing).Content
Run Code Online (Sandbox Code Playgroud)

结果摘录:

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>
...
Run Code Online (Sandbox Code Playgroud)

请注意,缺少FROM_COMMAND_LINE和FROM_DOCKERFILE。

在PowerShell控制台中,您可以验证变量是否不丢失:

PS C:\> $env:FROM_COMMAND_LINE
From command line
PS C:\> $env:FROM_DOCKERFILE
Value from dockerfile
Run Code Online (Sandbox Code Playgroud)

我也测试过进行iisreset,但是它不会改变行为。

  1. 我做错什么了吗?

  2. 还有其他方法可以指定环境变量以使它们可用于容器内的iis吗?


Dockerfile:

FROM microsoft/aspnet
ENV FROM_DOCKERFILE Value from dockerfile

ADD default.aspx c:/inetpub/wwwroot/default.aspx
Run Code Online (Sandbox Code Playgroud)

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));
}
%>
Run Code Online (Sandbox Code Playgroud)

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

Sou*_*tti 5

通过和为容器中的过程设置传递给dockerthrough的环境变量。-eCreateProcesslpEnvironment

它们没有被设置为驻留在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment蜂巢注册表中的系统变量,因此w3wp.exe即使您运行它们也不会接受更改iisreset。

您可以在此处使用几种解决方法:

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