2016-02-29 44 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