为什么容器IP和别名之间的交换导致AJAX请求不同?

时间:2015-12-10 03:36:16

标签: node.js nginx docker

使用 nginx + 节点 + 主机 docker堆栈时,我有一个小型示例项目located here that illustrates the problem I am seeing

我有2个容器:

  • 只返回json对象的节点(快速)应用程序。它是基于this website启用的COR。它的端口通过3000:80
  • 发布到主机
  • nginx 服务器,该服务器也基于this website启用了COR。它仅从默认位置(index.html)提供静态内容(main.js/usr/shared/nginx/html文件)。其端口通过8080:80发布。

主机单独运行容器时,我可以访问节点服务器并查看返回的JSON对象。当我访问nginx服务器时,我看到index.html并且main.js的javascript代码已经运行。

现在我将节点应用程序容器链接到nginx服务器容器。在 nginx 容器的main.js文件中,我尝试访问http://nodeapp/api处的服务器。我看到了CORs错误

  

XMLHttpRequest无法加载http://nodeapp/api。没有   请求中存在“Access-Control-Allow-Origin”标头   资源。因此不允许来源“http://localhost:8080”   访问。

奇怪的是,响应标题表示它来自nginx和我的快递应用程序正如我所料。 nginx容器也没有记录任何内容。

有效的事情

  • 如果我将XMLHttpRequest的url更改为节点容器的IP(例如172.17.0.2),它按预期工作响应头表明它来自快速服务器。在我的/etc/hosts文件中有一个条目:
    172.17.0.2 nodeapp abc123ContainerId quickserve_nodeapp_run_1

  • 当我curl来自交互式tty容器的节点容器时,它也按预期工作。

  • 如果我加载节点容器并使用http-server(主机上的服务器),它按预期工作响应标头表明它来自快速服务器。

1 个答案:

答案 0 :(得分:0)

以防它有一个包含,old thread (2013)在docker守护进程中提到了一个cor选项。
如今(2015年第4季度),docker daemon包括:

--api-cors-header=""                   Set CORS headers in the remote API
  

要在远程api中设置跨源请求,请在守护进程模式下运行Docker时为--api-cors-header赋值。 Set *(星号)允许全部,默认或空白表示CORS禁用

$ docker -d -H="192.168.1.9:2375" --api-cors-header="http://foo.bar"

这可能是您的情况下使用的设置。