如何制作JS代码的不同版本(开发和生产)?

时间:2017-05-18 17:42:20

标签: javascript nginx docker

我开发基于nginx镜像的分布在Docker容器中的小型Web应用程序。它包含普通的html和js代码,没有框架。

在JS代码中,可以通过WebSockets访问远程主机。环境存在差异:在localhost上进行测试时,它通过http工作,在生产服务器上使用https。因此,传递给WebSocket的URL从ws://wss://

开始

在代码中维护这些URL的两个版本的可靠解决方案是什么,考虑到我想为开发和生产保留单个Docker镜像,并且只使用不同的Docker Compose配置脚本?

WebSockets有一个例子:

// This is for testing in localhost environment
var url = "ws://" + window.location.host + window.location.pathname + "bridge/";
// This is for working in production environment
var url = "wss://" + window.location.host + window.location.pathname + "bridge/";
BRIDGE.socket = new WebSocket(url);

1 个答案:

答案 0 :(得分:1)

这是一个更简单的“运行时模板替换”的想法,可以起作用。

来自Docker Hub的基本nginx图片实际上有一个名为gettext的{​​{1}}包中的实用程序。它可以替换文件中的环境变量。我们可以在运行时通过将快速shell脚本作为入口点来替换我们来利用它。

首先,让我们创建envsubst脚本:

entrypoint.sh

这将在#!/bin/sh if [ -n "$BASEURL" ]; then envsubst '$BASEURL' < /my.js.template > /my.js exec nginx -g "daemon off;" else echo "you must specify \$BASEURL as en environment variable" fi 查找文件。我的示例文件如下所示:

/my.js.template

我们需要根据原始var url = "$BASEURL" + window.location.pathname + "bridge/"; 将其包装在新的Docker镜像中。 nginx看起来像:

Dockerfile

现在,假设FROM nginx COPY entrypoint.sh /entrypoint.sh COPY my.js.template /my.js.template ENTRYPOINT ["/entrypoint.sh"] 是您要替换每个环境的网址的文件,您可以启动此图像,如:

/my.js

它将替换docker run -d -e BASEURL=wss://myhost mynewnginximage int eh模板并将其写入$BASEURL,然后将/my.js作为PID 1执行,就像原始基本图像一样。

当然,您必须使shell脚本路径适应您的实际代码。但理论上,您现在可以使用相同的图像,只需更改每个环境的nginx环境变量。在Docker Compose中,您可以指定一个空白环境变量,如:

BASEURL

这将指示environment: BASEURL: 使用在本地shell上设置的docker-compose并将其传递给容器。所以,你不会像BASEURL那样:

docker-compose up

如果事情没有意义,请告诉我,我可以尝试澄清一下。 export BASEURL=ws://myhostfordev docker-compose up 用于更多模板化的替代方法可能类似于https://github.com/kelseyhightower/confd,而且功能更强大,也可以将环境变量作为模板的输入。