如何使JS代码的独特版本(开发和生产)?

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

在JS代码中,可以通过WebSockets访问远程主机。 环境有所不同:在本地主机上进行testing时,它通过http工作,在生产服务器上使用https。 所以传递给WebSocket的URL可以用ws://或者wss://

在代码中维护这两个URL版本的可靠解决scheme是什么?考虑到我希望为开发和生产保留一个Docker镜像,只使用不同的Docker Composeconfiguration脚本?

有一些使用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); 

这是一个简单的“运行时模板replace”的想法,可以工作。

Docker Hub的基础nginx镜像实际上有一个名为envsubstgettext包的实用工具。 它可以replace文件中的环境variables。 我们可以在运行时通过使用一个快速的shell脚本作为切入点来替代我们。

首先,我们来创build一个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/"; 

我们需要将其包装在基于原始nginx的新Docker镜像中。 Dockerfile将如下所示:

 FROM nginx COPY entrypoint.sh /entrypoint.sh COPY my.js.template /my.js.template ENTRYPOINT ["/entrypoint.sh"] 

现在,假设/my.js是您想要replace每个环境的URL的文件,您可以像这样启动此映像:

 docker run -d -e BASEURL=wss://myhost mynewnginximage 

它将replace$BASEURL int eh模板并将其写出到/my.js ,然后像原始基本图像一样执行nginx作为PID 1。

当然,你必须修改shell脚本path到你的实际代码。 但理论上,现在可以使用相同的映像,只需更改每个环境的BASEURL环境variables即可。 在Docker Compose中,您可以指定一个空白的环境variables,如:

 environment: BASEURL: 

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

 export BASEURL=ws://myhostfordev docker-compose up 

让我知道如果没有任何意义,我可以尝试澄清。 envsubst替代更多的模板可以是像https://github.com/kelseyhightower/confd,而不是更强大一些,也可以采取环境variables作为模板的input&#x3002;