2015-11-05 2 views
6

Ich habe eine Anforderung, bevor eine Anwendung ausgeführt wird, muss ein Teil davon die Umgebungsvariable lesen. Dazu habe ich folgende Docker Dateienvsubst Befehl in einem Container stecken

FROM nodesource/jessie:0.12.7 

# install gettext for envsubst 
RUN apt-get update 
RUN apt-get install -y gettext-base 

# cache package.json and node_modules to speed up builds 
ADD package.json package.json 
RUN npm install 

# Add source files 
ADD src src 

# Substiture value for backend endpoint env var 
RUN envsubst <src/js/envapp.js> src/js/app.js 

ADD node_modules node_modules 
EXPOSE 8000 
CMD ["npm","start"] 

Die obige envsubst Linie liest (sollte lesen) eine env Variable $MYENV und ersetzt es. Aber wenn ich die Datei app.js öffne, ist sie leer. Ich habe überprüft, ob die Umgebungsvariable im Container existiert und es tut. Irgendein Grund wird sein Wert nicht gelesen und ersetzt? Ich habe auch den gleichen Befehl im Container versucht und es funktioniert. Es funktioniert nur nicht, wenn ich das Bild

Antwort

5

ausführen Dies ist wahrscheinlich, weil $MYENV ist nicht verfügbar für envsubst, wenn Sie das Bild ausführen.

Jeder RUN-Befehl wird in einer eigenen Shell ausgeführt.

Aus den Docker Dokumentationen:

RUN (der Befehl in einer Shell ausgeführt wird -/bin/sh -c - Schalenform)

Sie müssen auch Ihr Profil beziehen,

RUN source ~/.bashrc && envsubst <src/js/envapp.js> src/js/app.js 
0

ich schlage vor, tha: zum Beispiel, wenn die $MYENV Umgebungsvariable in der .bashrc Datei verfügbar ist, können Sie Ihre Dockerfile wie folgt ändern t Seit Sie Node verwenden, verwenden Sie das Modul npm envsub.

Dieses Modul ist gut getestet und wurde für Docker entwickelt.

Es vermeidet die Notwendigkeit, auf andere Abhängigkeiten zu vertrauen, wenn Sie bereits das volle Knotenarsenal zur Hand haben.

EnvSub als

EnvSub beschrieben wird, ist envsubst für NodeJS

NodeJS globalen CLI-Modul auf Dateiebene Umgebungsvariable Substitution durch Lenker Bereitstellung

Ich bin der Autor des Pakets. Ich denke, du wirst es genießen.