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

标签 asp.net windows 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

结果摘录:

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 内部使用的环境变量 容器?


docker 文件:

FROM microsoft/aspnet
ENV FROM_DOCKERFILE Value from dockerfile

ADD default.aspx c:/inetpub/wwwroot/default.aspx

默认.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传递给docker的环境变量是通过CreateProcess and lpEnvironment.为容器中的进程设置的

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

这里有几个解决方法:

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

关于asp.net - Docker for Windows : ASP. NET 站点无法读取 Dockerfile 中定义的环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39978342/

相关文章:

c++ - VS 2015 宏解释

c++ - 可以从外部进程移动/调整窗口大小 [C++/Windows]

linux - 无论使用的存储驱动程序如何,都可以获得 docker 容器的 rootfs 吗?

docker - 使用 docker-compose 时如何读取外部 secret

.net - 通过电子邮件将文件上传到 Windows Azure

asp.net - 当多个 Blazor 应用程序发布到 IIS 时,我们收到 HTTP 错误 500.35 - ASP.NET Core 不支持同一应用程序池中的多个应用程序

python - 在 Windows 和 Mac OS 中使用 Python 中的默认 OS 应用程序打开文档

c# - 在 ASP.NET 项目中将数据类型从 Oracle 转换为 SQL Server

c# - 无法写入 html5 "date"类型的 asp.net 文本框控件

symfony - Docker 与 Symfony 4 - 无法看到文件更改