国产服务器多了一些安全性检查和限制

记录的原因是使用docker部署延时队列插件时总是报权限或者无法开启插件问题如下:

** (CaseClauseError) no case clause matching: {:error, {:cannot_read_enabled_plugins_file, ~c"/etc/rabbitmq/enabled_plugins", :eacces}}
    (rabbitmqctl 3.13.0-dev) lib/rabbitmq/cli/plugins/plugins_helpers.ex:112: RabbitMQ.CLI.Plugins.Helpers.update_enabled_plugins/4
    (rabbitmqctl 3.13.0-dev) lib/rabbitmq/cli/plugins/commands/enable_command.ex:127: anonymous fn/6 in RabbitMQ.CLI.Plugins.Commands.EnableCommand.do_run/2
    (elixir 1.17.2) lib/stream.ex:1593: anonymous fn/2 in Stream.iterate/2
    (elixir 1.17.2) lib/stream.ex:1820: Stream.do_unfold/4
    (elixir 1.17.2) lib/stream.ex:1891: Enumerable.Stream.do_each/4
    (elixir 1.17.2) lib/stream.ex:1052: Stream.do_transform_inner_enum/7
    (elixir 1.17.2) lib/stream.ex:1891: Enumerable.Stream.do_each/4
    (elixir 1.17.2) lib/enum.ex:2585: Enum.reduce_while/3

{:case_clause, {:error, {:cannot_read_enabled_plugins_file, ~c"/etc/rabbitmq/enabled_plugins", :eacces}}}

单纯安装rabbitmq是挺顺利的,主要问题在插件。以下未修正后的安装步骤

第一步运行mq容器

docker run -d \
  --name rabbitmq-server \
  --privileged=true \
  --restart unless-stopped \
  --cap-add=SYS_RESOURCE \
  --cap-add=SYS_ADMIN \
  -v /env/dockerapp/rabbitmq/data:/var/lib/rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  -e RABBITMQ_DEFAULT_USER=admin \
  -e RABBITMQ_DEFAULT_PASS=admin \
  rabbitmq:3.13-management

注:  --cap-add=SYS_RESOURCE \
          --cap-add=SYS_ADMIN \

          --privileged=true \  这三个参数是麒麟服务器额外添加的,处理安全校验

第二步下载延时队列插件

  如果需要延时队列需要执行下面命令
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.13.0/rabbitmq_delayed_message_exchange-3.13.0.ez

也可以自行上传插件包,这是在线下载

第三步插件丢到容器里

docker exec -it -u root rabbitmq-server chown rabbitmq:rabbitmq /plugins/rabbitmq_delayed_message_exchange-3.13.0.ez

我遇到的权限问题,导致不能安装插件

# 验证权限(应显示 -rw-r--r-- 1 rabbitmq rabbitmq)
docker exec -it -u root rabbitmq-server ls -l /plugins/rabbitmq_delayed_message_exchange-3.13.0.ez

第四步添加插件权限

# 修复 enabled_plugins 文件权限
docker exec -it -u root rabbitmq-server chown rabbitmq:rabbitmq /etc/rabbitmq/enabled_plugins
docker exec -it -u root rabbitmq-server chmod 644 /etc/rabbitmq/enabled_plugins
# 修复整个配置目录权限
docker exec -it -u root rabbitmq-server chown -R rabbitmq:rabbitmq /etc/rabbitmq

第五步启用插件

# 不再使用 -u root,改用镜像内实际用户 rabbitmq
docker exec -it -u rabbitmq rabbitmq-server rabbitmq-plugins enable rabbitmq_delayed_message_exchange

重启下mq

docker restart rabbitmq-server

最后验证

docker exec -it rabbitmq-server rabbitmq-plugins list | grep delayed

更多推荐