美文网首页
Vue应用在运行时获取docker的环境变量

Vue应用在运行时获取docker的环境变量

作者: 470d98b91bd3 | 来源:发表于2022-09-30 16:59 被阅读0次

问题原因

Vue.js应用程序依赖 .env 文件来指定应用程序的设置。在我们打包的时候,类似于hardcode方式,把这些环境变量给替换掉。

一旦应用程序被打包并分发到容器(如Docker)中,就没有办法在容器启动时动态设置应用程序的设置。原因是Vue.js应用程序实际上是在客户端运行的,只是通过Web服务器分发。如果每个环境有不同的应用设置,就需要为每个环境提供一个特定的容器。不同环境下的应用设置可能是应用的后端API端点的URL,或根据环境变量进行适当的逻辑调整

常见的解决办法

  • 根据域名去做判断

  • 初始化的时候,先请求后端的接口,让其返回环境变量

以上两种是市面上比较常见的做法。

方法一并不适用于我们,从我入职到现在不足一年,域名已经换了2次,每个项目都有6-7个环境,一旦换域名少说得花上2个小时去完成重新构建部署,很是麻烦

方法二在团队内有点不好推动,具体原因就不说了。

因此我只能是找新的方式来解决

特别的解决办法

在容器的启动过程中生成config.js文件。在容器启动过程中,会执行一个小的shell脚本,检查所需的系统环境变量是否存在,如果存在,就把它们写到config.js文件中。

大致逻辑如下:

image.png

操作

  • 在你的Vue.js应用程序中/public文件夹下创建一个新文件config.js,在这里定义你的环境变量

// will be overwritten during container startup
window.APPLICATION_SETTING_API_ENDPOINT_URL = null;
window.APPLICATION_SETTING_2 = null;
window.APPLICATION_SETTING_N = null;

  • 在 public/index.html 中引入 config.js 文件
<!DOCTYPE html>
<html lang="">
  <head>
    <!-- ... -->
    <script src="config.js" type="text/javascript"></script>
  </head>
  <body>
  <!-- ... -->
</html>

  • 创建一个 create_config_js.sh 文件,在Dockerfile同级目录
#!/bin/bash
SRC=${1:-} 

if [ -z $SRC ] || [ ! -e "$SRC" ]; then
    echo "Source file '$SRC' does not exist"
    exit 1
fi

OUTPUT="// generated"

while IFS="" read -r line || [ -n "$line" ]; do
    use_line=$line

    if [[ $line =~ "window." ]]; then
        ENVIRONMENT_VARIABLE_NAME=`echo $line | sed -re 's/window\.(.*)\s+\=(.*);/\1/g'`
        value=${!ENVIRONMENT_VARIABLE_NAME}

        if [[ ${value} && ${value-x} ]]; then
            use_line="window.$ENVIRONMENT_VARIABLE_NAME = '$value';"
        fi
    fi

    OUTPUT="$OUTPUT\n$use_line"
done <$SRC

echo -en $"$OUTPUT"

  • 修改你的dockerfile
WORKDIR /
COPY create_config_js.sh .
RUN chmod +x create_config_js.sh
COPY docker_entrypoint.sh .
RUN chmod +x docker_entrypoint.sh

EXPOSE 80
CMD ["/bin/sh", "docker_entrypoint.sh"]

  • 更新 docker_entrypoint.sh 以执行配置生成
SRC=/usr/share/nginx/html/public/config.js

# quoting is required to keep line breaks
NEW_CONFIG="$(./create_config_js.sh $SRC)"
echo "$NEW_CONFIG" > $SRC

# start webserver, e.g. apache or nginx
nginx -g "daemon off;"

相关文章

网友评论

      本文标题:Vue应用在运行时获取docker的环境变量

      本文链接:https://www.haomeiwen.com/subject/ldqcbktx.html