2016-10-11 2 views
0

Ich habe eine ASP.NET-Site, die in einem Windows-Dockercontainer ausgeführt wird. Ich möchte in der Dockerfile definierte Umgebungsvariablen lesen können. (Und wenn starrt aus dem Behälter.)Docker für Windows: ASP.NET-Site kann Umgebungsvariablen nicht lesen, die in Dockerfile definiert sind

Ich bin nicht in der Lage, damit es funktioniert:

Repro:

  • Installieren und Konfigurieren von Software benötigte Fenster Container zu verwenden.

  • Erstellen Sie einen neuen (leeren) Ordner.

  • Erstellen Sie zwei Dateien (Dockerfile und default.aspx) im neuen Ordner mit dem unten beschriebenen Inhalt.

  • Navigieren Sie zu dem leeren Ordner und führen docker build -t test . (Dies wird einen Behälter Bild mit dem Namen Test

  • startet Powershell in einem interaktiven Container erstellen: docker run -it --rm -e FROM_COMMAND_LINE="From command line" --entrypoint powershell test

Sie jetzt in einem sein Powershell-Eingabeaufforderung innerhalb des Containers Sie können jetzt überprüfen, dass die Umgebungsvariablen auf der Website nicht verfügbar sind, indem Sie die Webseite abrufen:

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

Auszug aus dem Ergebnis:

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> 
... 

Beachten Sie, dass FROM_COMMAND_LINE und FROM_DOCKERFILE fehlen.

In der Powershell-Konsole können Sie überprüfen, ob die Variablen fehlen nicht:

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

Ich habe auch ein iisreset tun getestet, aber es funktioniert nicht, das Verhalten ändern.

  1. Habe ich etwas falsch gemacht?

  2. Gibt es andere Möglichkeiten, Umgebungsvariablen anzugeben, die sie innerhalb von dem Container verfügbar machen würden?


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)); 
} 
%> 

Anmerkung: Ich bin derzeit mit Docker Version 1.12.2-rc1-beta27.1 (Build: 7538) a0eb77a

+0

Sie 'ENV' Richtlinie sieht nicht korrekt aus: https://docs.docker.com/engine/reference/builder/#/env – bjhaid

+0

Wenn Sie genau hinsehen, verwende ich die erste Variante der Syntax: 'ENV ' und ist FROM_DOCKERFILE und ist Wert von dockerfile: 'ENV FROM_DOCKERFILE Wert von dockerfile' (auch, wie Sie oben im Text zu sehen, alles in der Powershell-Konsole korrekt ist, aber nicht in den web- Anwendung) –

+0

Ich habe ein Problem auf github hinzugefügt: [https://github.com/Microsoft/aspnet-docker/issues/7](https://github.com/Microsoft/aspnet-docker/issues/7) –

Antwort

2

Variablen Environment docker durch -e geben werden für den Prozess in dem Behälter eingestellt über CreateProcess and lpEnvironment.

Sie werden nicht als Systemvariablen gesetzt, die in der Registrierung in der HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment hive wohnen würden und Daher wird w3wp.exe die Änderungen nicht übernehmen, selbst wenn Sie iisreset ausführen.

Sie haben ein paar Abhilfe Möglichkeiten:

  • Sie könnten eine Systemvariable erstellen, indem RUN setx /m VAR val in Ihrem Dockerfile läuft. Dies würde von Ihrem IIS-Arbeitsprozess ausgewählt werden, nachdem Sie iisreset ausgeführt haben.
  • Erstellen Sie eine Umgebungsvariable nur für diesen AppPool. RUN appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='DefaultAppPool'].environmentVariables.[name='VAR',value='val']" /commit:apphost.
0

Es ist jetzt eine bessere Option verfügbar. Grundsätzlich, wenn Sie Ihren Docker auf microsoft/aspnet basieren, wird es die neueste "ServiceMonitor.exe" enthalten, die für den lokalen Prozess definierte Umgebungsvariablen in IIS AppPool injizieren wird. Es ist sofort verfügbar, ohne dass der IIS-Prozess neu gestartet werden muss.

Es gibt einen Hack, der Anwendungspool muss jedoch "DefaultAppPool" sein, sodass Sie keine benutzerdefinierten App-Pools erstellen können. Dies sollte für weitere Bereitstellungen in Ordnung sein. Sie können mehr über dieses Update here lesen.

Verwandte Themen