# rabbitmq启用stomp和延时队列(rabbitmq_delayed_message_exchange插件)构建多平台镜像

> wandoubaba / 2024-10-29

## 下载对应版本的插件安装包

本文使用的rabbitmq版本是3.13.4，用下面的命令可以下载对应的延时队列插件安装包

```sh
curl -L -O https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.13.0/rabbitmq_delayed_message_exchange-3.13.0.ez
```

> 如果要使用其他版本的rabbitmq，可以到 <https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases> 去找对应的安装包。

## Dockerfile文件

```dockerfile
# 使用 RabbitMQ 3.13.4 管理镜像作为基础镜像  
FROM rabbitmq:3.13.4-management  

# 设置工作目录  
WORKDIR /  

# 将本地的插件文件复制到容器内  
COPY rabbitmq_delayed_message_exchange-3.13.0.ez .  

# 启用插件  
RUN rabbitmq-plugins enable rabbitmq_delayed_message_exchange rabbitmq_stomp rabbitmq_web_stomp rabbitmq_web_stomp_examples  

# 持久化数据目录  
VOLUME ["/var/lib/rabbitmq/mnesia"]  

# 将容器的启动命令更改为默认命令  
CMD ["rabbitmq-server"]
```

> `Dockerfile`文件应该与`rabbitmq_delayed_message_exchange-3.13.0.ez`文件在同一个目录下。

## 构建多平台镜像

### 确认`docker buildx`环境

```sh
docker info
```

执行以上命令可以看到类似下面的信息：

```txt
Client: Docker Engine - Community
 Version:    27.0.3
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.15.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.28.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose
...
```

一般情况下，如果是通过包管理器安装的docker engine或者docker desktop的话，默认就已经安装好了buildx和compose插件了。

### 跨平台构建并发布

接下来，我们的目标是用上面的Dockerfile构建多平台的`rabbitmq:3.13.4`镜像并直接推送到`quay.io`平台上：

> 为什么是`quay.io`？因为有一段时间全国封锁docker-hub时，`quay.io`是可以推拉镜像的，仅此而已。

```sh
docker login quay.io
docker buildx create --use
docker buildx build --platform linux/amd64,linux/arm/v7,linux/arm64 --push -t quay.io/wandoubaba517/rabbitmq:3.13.4 .
```

执行上面的命令，执行过程中会自动从docker hub上拉取名为`moby/buildkit:buildx-stable-1`的镜像并启动容器开始自动构建和推送，整个过程在我的2核4G服务器上执行了好几个小时，所以建议使用`tmux`等工具，任务执行起来就可以关闭终端了。

## 使用镜像

```sh
docker run -d \
    -p 5672:5672 \
    -p 15672:15672 \
    -p 61613:61613 \
    -v ./data:/var/lib/rabbitmq/mnesia \
    -v ./conf/conf.d:/etc/rabbitmq/conf.d \
    --hostname rabbitmq \
    --name rabbitmq \
    quay.io/wandoubaba517/rabbitmq:3.13.4
```

## 工程示例

<https://git.wandoubaba.com/wandoubaba/docker-rabbitmq>

```sh
git clone git@git.wandoubaba.com:wandoubaba/docker-rabbitmq.git
cd docker-rabbitmq
# 先在conf/conf.d/10-defaults.conf文件中设置首次启动创建的默认用户名和密码
# 然后再执行启动脚本
./start
```
