我正在尝试将一个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"