创建入口脚本以获取以VUE_APP_开头的所有环境变量并获取其值

93次阅读
没有评论

问题描述

在将现有的 Vue.js 应用程序 Docker 化以用于分阶段的部署时,你希望创建一个入口脚本,用于获取以 VUE_APP_ 开头的所有环境变量并获取其值。你希望在运行 npm build 命令时,将这些环境变量的值置于目标文件中。具体步骤如下:

  1. 在运行 npm run build 命令时,将 VUE_APP_ 开头的环境变量值放入目标文件中,如 index.html。
  2. 你计划创建一个名为 entry-point.sh 的脚本,该脚本将获取所有以 VUE_APP_ 开头的环境变量的值,并使用 sed 命令在 index.html 中查找并替换这些硬编码的变量占位符。最后,启动 Nginx 服务器。

你在第三步遇到了困难。

解决方案

请注意以下操作可能涉及版本差异及修改前务必做好备份。

步骤1:构建阶段

在 Dockerfile 中,我们使用多阶段构建来实现构建和部署。首先,我们需要确保在构建阶段将环境变量值放入目标文件(例如 index.html)。下面是如何在 Dockerfile 中实现的步骤:

# 构建阶段
FROM node:lts-alpine as build-stage
LABEL maintainer="servers@xpl.com"
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . ./
RUN npm run build

步骤2:编写入口脚本

现在,我们将编写一个名为 entry-point.sh 的脚本,该脚本将获取所有以 VUE_APP_ 开头的环境变量的值,并使用 sed 命令在 index.html 中查找并替换这些硬编码的变量占位符。以下是脚本的内容:

#!/bin/sh

# 获取所有以 VUE_APP_ 开头的环境变量,并将其替换为实际值
for env_var in $(env | grep '^VUE_APP_' | sed -e 's/=.*//'); do
  var_value=$(eval echo "\$$env_var")
  sed -i "s#\${$env_var}#$var_value#g" /app/dist/index.html
done

# 启动 Nginx 服务器
nginx -g 'daemon off;'

步骤3:构建包含入口脚本的镜像

在 Dockerfile 中添加以下内容,将入口脚本复制到镜像中并设置可执行权限:

# 生产阶段
FROM nginx:stable-alpine
LABEL maintainer="servers@xpl.com"
COPY --from=build-stage /app/dist/ /app/dist/
COPY nginx/nginx.conf /etc/nginx/

# 复制入口脚本并设置可执行权限
COPY entry-point.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entry-point.sh

# 启动 Nginx 服务器
CMD ["entry-point.sh"]

步骤4:构建并运行 Docker 容器

使用以下命令构建并运行 Docker 容器:

docker build -t your_image_name .
docker run -d -p 80:80 your_image_name

以上步骤将创建一个 Docker 镜像,其中包含了构建阶段的应用程序文件和入口脚本。当容器启动时,入口脚本将自动获取环境变量值并在 index.html 中进行替换,然后启动 Nginx 服务器。

请注意,这只是一个基本的示例,实际情况可能需要根据具体需求进行调整和优化。同时,对于用于生产环境的 Docker 配置,可能需要考虑更多的安全性和性能方面的设置。

总结

通过上述步骤,你可以成功地创建一个入口脚本,该脚本可以获取以 VUE_APP_ 开头的所有环境变量的值,并在构建阶段将这些值置于目标文件中。这将帮助你将 Vue.js 应用程序 Docker 化以便于部署到生产环境中。

请注意,上述解决方案假设你已经将环境变量的值设置为硬编码的方式放入 .env 文件中,然后在构建阶段通过入口脚本将这些值替换到目标文件中。如果你希望在运行时动态传递环境变量,可能需要结合其他工具或技术来实现。

正文完