我开发基于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);
答案 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,而且功能更强大,也可以将环境变量作为模板的输入。