如何使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
镜像实际上有一个名为envsubst
的gettext
包的实用工具。 它可以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。