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

Javascript 如何制作JS代码的不同版本(开发和生产)?,javascript,nginx,docker,Javascript,Nginx,Docker,我开发了基于nginx映像的小型web应用程序,分布在Docker容器中。它包含纯html和js代码,没有框架 在JS代码中,可以通过WebSocket访问远程主机。在环境中存在差异:在本地主机上测试时,它通过http工作,在生产服务器上使用https。因此,传递给WebSocket的URL以ws://或wss开头:// 考虑到我希望为开发和生产保留单个Docker映像,并且只使用不同的Docker Compose配置脚本,在代码中维护这些URL的两个版本的可靠解决方案是什么 下面是使用WebS

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

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

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

下面是使用WebSocket的示例:

// 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);

下面是一个更简单的运行时模板替换思想,它可以工作

Docker Hub的基本nginx映像实际上有一个来自gettext包的实用程序,名为envsubst。它可以替换文件中的环境变量。我们可以在运行时利用这一点,制作一个快速的shell脚本作为入口点,为我们进行替换

首先,让我们创建entrypoint.sh脚本:

我们需要在原始nginx的基础上,用一个新的Docker映像来包装它。Dockerfile将类似于:

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

docker run -d -e BASEURL=wss://myhost mynewnginximage
它将替换$BASEURL int-eh模板,并将其写入/my.js,然后像原始基本映像一样以PID 1的形式执行nginx

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

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


如果有什么不合理的地方,请告诉我,我可以试着澄清。envsubs的替代方法是使用更强大的环境变量作为模板的输入。

请为您正在使用的js或脚本提供一些代码。我认为这与Docker无关。即使Docker不参与,你也会有同样的问题,对吗?@AndyShinn当然,没有Docker,问题仍然存在。但它是相关的,因为我想用Docker的功能来解决它。我已经为项目中的其他图像使用了不同的Compose配置文件覆盖。我认为在这种情况下,这是两个不同的问题,首先是如何在同一个JavaScript项目中拥有不同的基本URL。解决这个问题后,要么是要添加什么,比如一个环境变量,要么是一个关于如何对Docker Compose进行更改的单独问题。@AndyShinn你是对的,这个问题可以很容易地一分为二。事实上,第二个问题对我来说不是问题:也许我错了,提到nginx和Docker,只是想给出一些问题的背景。也许这会更容易找到解决办法。现在我正在挖掘nginx ssi和变量,它似乎可以用作环境变量。我会张贴解决方案,如果发现任何。我喜欢你的解决方案!入口点的envsubt似乎是位于适当位置的适当工具。事实上,我想我会更进一步,通过这种方式传递的不仅仅是Websocket URL,而是定义JS范围的常量,比如APP_ENV=$APP_ENV,并在代码中的switch语句中使用它;
docker run -d -e BASEURL=wss://myhost mynewnginximage
environment:
  BASEURL:
export BASEURL=ws://myhostfordev
docker-compose up