热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何将环境变量传递给前端Web应用程序?

如何解决《如何将环境变量传递给前端Web应用程序?》经验,为你挑选了2个好方法。

我试图容纳一个前端Web应用程序,我有麻烦弄清楚如何传递环境变量.该应用程序是一个Angular应用程序,因此它是100%客户端.

在典型的后端服务中,传递环境变量很容易,因为一切都在同一主机上运行,​​因此后端服务可以轻松选择环境变量.但是,在前端应用程序中,这是不同的:应用程序在客户端的浏览器中运行.

我想通过环境变量配置我的应用程序,因为这使部署更容易.所有配置都可以完成,docker-compose.yml无需维护多个映像,每个映像都适用于所有可能的环境.只有一个不可变的图像.这遵循12因素应用原则,可以在https://12factor.net/config上找到.

我正在构建我的应用程序映像如下:

FROM node:alpine as builder
COPY package.json ./
RUN npm i && mkdir /app && cp -R ./node_modules ./app
WORKDIR /app
COPY . .
RUN $(npm bin)/ng build

FROM nginx:alpine
COPY nginx/default.conf /etc/nginx/conf.d/
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /app/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]

app/config.ts,我有:

export const cOnfig= {
    REST_API_URL: 'http://default-url-to-my-backend-rest-api'
};

理想情况下,我想在我的网站上做这样的事情docker-compose.yml:

backend:
  image: ...
frontend:
  image: my-frontend-app
  environment:
    - REST_API_URL=http://backend:8080/api

所以我相信我应该改变它app/config.ts来替换REST_API_URL环境变量.因为我更喜欢不可变的Docker镜像(所以我不想在构建期间进行替换),我很困惑如何在这里取得进展.我相信我应该支持app/config.ts在nginx代理启动之前改变运行时.但是,这个文件被缩小并且webpack-bundled的事实使得这更加困难.

任何想法如何解决这个问题?



1> Daniel Calde..:

我解决这个问题的方式如下:

1.使用唯一且可识别的字符串在enviroment.prod.ts中设置值:

export const envirOnment= {
  production: true,
  REST_API_URL: 'REST_API_URL_REPLACE',
};

2.创建一个entryPoint.sh,每次你完成容器的docker运行时,都会执行这个entryPoint.

#!/bin/bash
set -xe
: "${REST_API_URL_REPLACE?Need an api url}"

sed -i "s/REST_API_URL_REPLACE/$REST_API_URL_REPLACE/g" /usr/share/nginx/html/main*bundle.js

exec "$@"

如您所见,此入口点获取'REST_API_URL_REPLACE'参数并在main*bundle.js文件中替换它(在本例中)以获取var的值.

3.在CMD之前的dockerfile中添加entrypoint.sh(它需要执行权限):

FROM node:alpine as builder
COPY package.json ./
RUN npm i && mkdir /app && cp -R ./node_modules ./app
WORKDIR /app
COPY . .
RUN $(npm bin)/ng build --prod

FROM nginx:alpine
COPY nginx/default.conf /etc/nginx/conf.d/
RUN rm -rf /usr/share/nginx/html/*
COPY --from=builder /app/dist /usr/share/nginx/html

# Copy the EntryPoint
COPY ./entryPoint.sh /
RUN chmod +x entryPoint.sh

ENTRYPOINT ["/entryPoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

4.使用env或使用docker-compose(必须转义斜杠)来恢复图像:

docker run -e REST_API_URL_REPLACE='http:\/\/backend:8080\/api'-p 80:80 image:tag

可能存在一个更好的解决方案,不需要在缩小文件中使用常规表达式,但这样可以正常工作.



2> Gene C..:

将您的环境变量放在index.html!!

相信我,我知道你来自哪里!将特定于环境的变量烘烤到Angular应用程序的构建阶段中,与我所学到的有关可移植性和关注点分离的一切情况背道而驰。

可是等等!仔细看一下常见的Angular index.html



  
  
  
  
  
  
  


  
  
  
  


这就是所有配置!!!

就像用来维护Docker应用程序的docker-compose.yml一样:

版本化的不可变资产

环境变量

应用程序绑定

环境元数据

甚至不同的捆绑包都感觉像是docker image sorta的图层,不是吗?

runtime 就像您很少更改的基本图片一样。

polyfills 是您需要的那些没有包含在您所需的基本映像中的东西。

main 是您的实际应用,每个版本都会有很大的变化。

您可以使用前端应用程序执行与使用Docker应用程序相同的操作!

    构建,版本化和发布不可变资产(js包/ Docker映像)

    将部署清单发布到登台(index.html / docker-compose.yml)

    分阶段测试

    将部署清单发布到生产中。引用您刚刚测试的相同资产!即刻!原子地!

怎么样??

只是将臭味指向/src/environments/environment.prod.tswindow对象。

export const envirOnment= (window as any).env;
// or be a rebel and just use window.env directly in your components

并使用环境变量WHERE THEY BELONG将脚本添加到index.html



我对这种方法感到非常强烈,因此我创建了一个专用于此的网站:https : //immutablewebapps.org。我想您会发现还有很多其他好处!

~~~

现在,我已经使用两个AWS S3存储桶成功完成了此操作:一个用于版本化的静态资产,一个仅用于版本化index.html(这使路由变得非常简单:index.html为每个路径提供服务)。我还没有像您建议的那样运行容器。如果要使用容器,则希望在构建和发布新资产以及发布新资产之间进行明确区分index.html。也许我会index.html从带有容器环境变量的模板中即时渲染。

如果您选择这种方法,我很想知道结果如何!


推荐阅读
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
  • docker-logs6000tcp,0.0.0.0:6000-80tcpvigilant_mclean尝试使用URLhttp:0.0.0.0:60 ... [详细]
  • 我正在尝试使用SHA256哈希搜索图像:我有sha256哈希,我想知道是否存在带有 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • dockerfile方式创建容器最简单的dockerfile创建镜像使用此镜像运行一个容器dockerfile基本要素dockerfile指令FROM:  FROM{base镜像} ... [详细]
  • Dockerfile中怎么将war包打入镜像
    今天就跟大家聊聊有关Dockerfile中怎么将war包打入镜像,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据 ... [详细]
  • 其实就是将web服务器的部署操作用docker形式来替代,那么也就是用dockerfile来实现部署操作。下面是dockerfileFROMubuntuMAINTAINERshuaibing.huo@ ... [详细]
  • 我正在尝试构建docker,但不断抛出错误 ERROR:Service'telegraf'failedtobuild:COPYfailed:s ... [详细]
author-avatar
钓鱼翁玩围脖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有