0%

initialize RabbitMQ container's Queue and Exchange

為了測試方便常常會在本機起 RabbitMQ Container,但隨著系統的演進初始化 RabbitMQ 變得越來越複雜,例如:每次都要先設定 8 組 Queue,Exchange binding …等等

工程師的美德就是懶,所以開始找辦法是不是可以讓 RabbitMQ Container 起來時就自己設定好呢?

解法

RabbitMQ 有提供設定檔來初始化,分別為放在

1
2
/etc/rabbitmq/rabbitmq.config
/etc/rabbitmq/definitions.json

而這兩個檔案裡面可以設定 VirtualHost、Authorization、Exchange、Queue

rabbitmq.config
這邊特別提醒一下,內容最後面那個小點不是打錯喔,是規定就是要有的!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
{
rabbit,
[
{ loopback_users, [] }
]
},
{
rabbitmq_management,
[
{ load_definitions, "/etc/rabbitmq/definitions.json" }
]
}
].

definitions.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
"rabbit_version": "3.8",
"users": [
{
"name": "guest",
"password": "guest",
"tags": "administrator"
}
],
"vhosts": [
{ "name": "/" }
],
"permissions": [
{
"user": "guest",
"vhost": "/",
"configure": ".*",
"write": ".*",
"read": ".*"
}
],
"parameters": [],
"policies": [],
"exchanges": [
{
"name": "nmq",
"vhost": "/",
"type": "direct",
"durable": true,
"auto_delete": false,
"internal": false,
"arguments": {}
}
],
"queues": [
{
"name": "command",
"vhost": "/",
"durable": true,
"auto_delete": false,
"arguments": {}
}
],
"bindings": [
{
"source": "nmq",
"vhost": "/",
"destination": "command",
"destination_type": "queue",
"routing_key": "command",
"arguments": {}
}
]
}

方案一

在啟動 rabbitmq container 的時候將這兩個檔案透過 volume 的方式丟進去,這樣就可以達成目的了

1
2
3
$ docker run -it \
-v /etc/so/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro \
-v /etc/so/definitions.json:/etc/rabbitmq/definitions.json:ro rabbitmq:3.8-management

方案二

如過你不幸 (?) 的跟我一樣是使用 windows container,volume 這個選擇不屬於你,因為 windows container 只能將整個資料夾 volume 進去,並不能指定單一檔案,所以如果將整個資料夾放進去,需要額外將一些本該在 /etc/rabbitmq 底下的檔案也都 copy 出來,才不會跑起來的時候少東少西的,但這個方法總覺得有點麻煩,所以我採用自己 build image 的方案

dockerfile

1
2
3
4
FROM rabbitmq:3.8-management

ADD rabbitmq.config /etc/rabbitmq/
ADD definitions.json /etc/rabbitmq/

透過 build image 的過程中將檔案放進去,之後起起來也都不用在下 volume 指令,也算是簡單不少