我正在尝试在具有 EFS 持久性的 AWSVPC 网络的 ECS 中运行 RabbitMQ。
问题是 AWSVPC 上的 ECS 每次重新启动容器时都会重置主机名。这会导致 rabbitmq 启动一个全新的目录,因此/var/lib/rabbitmq
会丢失所有持久性。
例如:启动一次,/var/lib/rabbitmq
将包含:
drwxr-xr-x 4 100 root 6.0K Dec 23 13:00 rabbit@ip-10-0-12-171
-rw-r--r-- 1 100 root 90 Dec 23 12:57 rabbit@ip-10-0-12-171-feature_flags
drwxr-xr-x 10 100 root 6.0K Dec 23 12:57 rabbit@ip-10-0-12-171-plugins-expand
下次启动时,IP 将会改变,其他所有内容都将被删除。
我尝试设置HOSTNAME
环境变量但没有任何效果。
我尝试过设置RABBITMQ_MNESIA_DIR
,但之后第二启动容器只是循环并且没有显示明显的错误消息供我在此处发布。
我尝试[email protected]
在容器上设置(route53 托管域名)。但这会导致令人费解的错误:
[error] Supervisor net_sup had child net_kernel started with net_kernel:start_link(['[email protected]',shortnames], false, net_sup_dynamic) at undefined exit with reason {'EXIT',nodistribution} in context start_error
上的例子dockerhub 页面只显示设置主机名。但由于这是 AWSVPC 上的 ECS,因此我无法仅hostname
在容器定义中设置。根据手册:
笔记
如果您使用 awsvpc 网络模式,则不支持 hostname 参数。
我只需要让 rabbitmq 确信主机名是静态的。我不在乎外部的域或主机名是什么,只关心容器内部的进程认为的主机名是什么。除了hostname
在任务定义中设置之外,还有其他方法可以设置吗?
答案1
我通过使用 EFS for mnesia、将 RABBITMQ_NODENAME 设置为“rabbit@localhost”并指定 RABBITMQ_MNESIA_DIR 来实现这一点。
environment = [
{
name = "RABBITMQ_NODENAME"
value = "rabbit@localhost"
},
{
name = "RABBITMQ_MNESIA_DIR"
value = "/var/lib/rabbitmq/mnesia/fox"
}
]
...
mountPoints = [
{
"containerPath" : "/var/lib/rabbitmq/mnesia",
"sourceVolume" : "efs-rabbitmq-mnesia"
}
]
...
volume {
name = "efs-rabbitmq-mnesia"
efs_volume_configuration {
file_system_id = aws_efs_file_system.efs.id
transit_encryption = "ENABLED"
authorization_config {
access_point_id = aws_efs_access_point.mnesia.id
}
}
}