2016-02-29 48 views
2

我正在使用ElasticMQ在我的本地开发机器上模拟AWS SQS。我在Docker容器中运行ElasticMQ,使用docker-osx-dev在Linux VM上托管Docker容器。这意味着我在VM的IP上访问本地ElasticMQ实例,而不是本地IP。为什么创建本地队列时Node.js AWS-SDK返回错误的SQS队列URL

当我尝试使用下面的代码在EMQ中创建一个队列时,它会在localhost返回一个队列URL,而不是托管docker容器的虚拟机的IP。

var AWS = require('aws-sdk'); 
var config = { 
    endpoint: new AWS.Endpoint('http://192.168.59.103:9324'), 
    accessKeyId: 'na', 
    secretAccessKey: 'na', 
    region: 'us-west-2' 
} 
var sqs = new AWS.SQS(config); 
var params = { 
    QueueName: 'test_queue' 
}; 
sqs.createQueue(params, function(err, data) { 
    if (err) { 
    console.log(err); 
    } else { 
    console.log(data.QueueUrl); 
    } 
}); 

目前该代码返回:http://localhost:9324/queue/test_queue,但它应该返回http://192.168.59.103:9324/queue/test_queue。如果我将URL中的'localhost'替换为实际的IP地址,我可以成功访问带有该URL的队列,表明它确实被创建,但这是一个非常讨厌的黑客行为。在上面的代码中需要更改哪些内容才能解决此问题?

+0

感谢。今天真的需要这个。 – RichS

回答

1

您正面临的问题是,ElasticMq正在公开它运行的容器的主机和端口。这是我之前遇到的一个问题,通过创建一个定制的Docker容器来修复它,让您可以设置主机和端口编程。

我已经写了关于如何修复它blog post,但在本质上,你需要做的是:

  • 使用我的自定义图像tddmonkey/elasticmq
  • 当你创建设置NODE_HOSTNODE_PORT环境变量集装箱。

最终为这你的命令行是:

$ docker run -e NODE_HOST=`docker-machine ip default` -e NODE_PORT=8000 -p 8000:9324 tddmonkey/elasticmq

+0

非常感谢您的快速回答!这似乎现在正在完美运作。就此主题而言;你知道是否有简单的方法将所有VM机器的端口转发到本地主机,以避免在设置端点等时查找虚拟机的IP地址? – LaserJesus

+0

我想你说的是能够使用'localhost'而不是VM IP地址?如果是这样,它不像端口转发VM端口那么简单,您需要localhost来转发这些端口上的所有通信。说实话,我怀疑这是值得的,因为你的生产代码应该可以配置为接受不同的目标IP – tddmonkey

+0

酷,我通过环境变量/配置文件设置端点等,所以很容易根据需要进行更改。只是想知道是否有'银弹'。 – LaserJesus