如果未设置环境变量,则将变量默认设置为当前窗口位置



我正在尝试将一个javascript项目固定化。UI项目从端点读取其API端点,该端点在运行时设置为容器的环境变量

我解析这个环境变量的方法是将设置为傻瓜

apiUrl: 'http://'+JSON.parse($envVariable).endpoints.backend + ':80'

有一个shell脚本,它将$envVariable的值替换为基于envsubst的api端点url(https://www.gnu.org/software/gettext/manual/html_node/envsubst-Invocation.html)

现在,

这个项目在不作为容器运行时,应该从其当前位置读取其api端点,即

'http://'+window.location.hostname+':8080'

我如何实现逻辑,以便如果仅设置环境变量,则使用第一个解析实现,否则默认为窗口位置?挑战是我无法从浏览器读取env变量

这是码头文件

FROM ubuntu:14.04
#Install Node
RUN apt-get update -y
RUN apt-get upgrade -y
RUN apt-get install nodejs -y
RUN apt-get install nodejs-legacy -y
RUN apt-get install npm -y
RUN update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
# Install packages for envsubst
RUN apt-get update && apt-get upgrade -y --force-yes && rm -rf /var/lib/apt/lists/*;
RUN apt-get update
RUN apt-get install -y gettext-base

# Create app directory 
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
# cache package.json and node_modules provide dependencies
COPY dist dist
COPY envcombined.js dist/scripts/envcombined.js
COPY package.json package.json
RUN mkdir dist/node_modules
COPY node_modules dist/node_modules
# Substitute dependencies from environment variables
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
EXPOSE 8000

以及入口点脚本

#!/bin/sh
rm -rf /usr/src/app/dist/scripts/combined.js
envsubst $envVariable < "/usr/src/app/dist/scripts/envcombined.js" > "/usr/src/app/dist/scripts/combined.js"
cp package.json /usr/src/app/dist/
cd /usr/src/app/dist/
exec npm start

我可以有以下声明,以便将apiEndpoint评估为窗口位置

var $EnvVar = '{"endpoints":{"api":"http://'+window.location.hostname+':8080"}}'

apiUrl :JSON.parse($EnvVar).endpoints.api;

现在,shell脚本应该只替换第二次出现的$EnvVar

实现这一点的一种方法是创建一个自定义变量:

customApiUrl = ('$envVariable'.length ? 'http://'+JSON.parse($envVariable).endpoints.backend + ':80' : 'http://'+window.location.hostname+':8080')

并像这样使用:

apiUrl: customApiUrl

当你运行envsubst时,结果是:

/tmp $ cat a.js
customApiUrl = ('$envVariable'.length ? 'http://'+JSON.parse($envVariable).endpoints.backend + ':80' : 'http://'+window.location.hostname+':8080')
# Without the envVariable set
/tmp $ envVariable= envsubst $envVariable < a.js
customApiUrl = (''.length ? 'http://'+JSON.parse().endpoints.backend + ':80' : 'http://'+window.location.hostname+':8080')
# With the envVariable set
/tmp $ envVariable='decodeMe' envsubst $envVariable < a.js
customApiUrl = ('decodeMe'.length ? 'http://'+JSON.parse(decodeMe).endpoints.backend + ':80' : 'http://'+window.location.hostname+':8080')

如果您计划使用问题中提到的$EnvVar声明,您也可以有条件地替换脚本中第二次出现的$EnvVar

/tmp $ cat b.js
var $EnvVar = '{"endpoints":{"api":"http://'+window.location.hostname+':8080"}}'    
apiUrl :JSON.parse($EnvVar).endpoints.api;
/tmp $ EnvVar=''
/tmp $ [ ! -z "$EnvVar" ] && sed  "0,/EnvVar/! s/EnvVar/$EnvVar/" -i b.js
/tmp $ cat b.js # No change
var $EnvVar = '{"endpoints":{"api":"http://'+window.location.hostname+':8080"}}'    
apiUrl :JSON.parse($EnvVar).endpoints.api;

/tmp $ EnvVar='my_variable'                                                                                                                                                                                    
/tmp $ [ ! -z "$EnvVar" ] && sed  "0,/EnvVar/! s/EnvVar/$EnvVar/" -i b.js
/tmp $ cat b.js # variable got substituted in the second occurrence 
var $EnvVar = '{"endpoints":{"api":"http://'+window.location.hostname+':8080"}}'    
apiUrl :JSON.parse($my_variable).endpoints.api;

在shell脚本中,您可以将其用作:

if [ ! -z "$EnvVar" ] 
then
sed "0,/EnvVar/! s/EnvVar/$EnvVar/" "/usr/src/app/dist/scripts/envcombined.js" > "/usr/src/app/dist/scripts/combined.js"
else
cp "/usr/src/app/dist/scripts/envcombined.js" "/usr/src/app/dist/scripts/combined.js"
fi

或者,您可以直接替换已经存在的文件:

[ ! -z "$EnvVar" ] && sed  "0,/EnvVar/! s/EnvVar/$EnvVar/" -i "/usr/src/app/dist/scripts/combined.js"

最新更新