启动 RabbitMQ Docker 容器时如何添加初始用户?

新手上路,请多包涵

目前我正在使用来自 DockerHub 的默认 RabbitMQ 映像启动 RabbitMQ Docker 容器。使用以下命令。

 docker run --restart=always \
-d \
-e RABBITMQ_NODENAME=rabbitmq \
-v /opt/docker/rabbitmq/data:/var/lib/rabbitmq/mnesia/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
--name rabbitmq rabbitmq:3-management

我需要在第一次启动映像时提供默认用户/和虚拟主机。例如创建一个默认的“测试用户”。

目前我必须通过使用管理插件并通过 web ui 添加用户/虚拟主机来手动执行此操作。有没有办法在启动 RabbitMQ 图像时提供默认设置?

原文由 Marco 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您可以创建一个简单的 Dockerfile 来扩展基本映像的功能并创建一个默认用户。您需要的 Docker 文件如下:

 FROM rabbitmq

# Define environment variables.
ENV RABBITMQ_USER user
ENV RABBITMQ_PASSWORD user
ENV RABBITMQ_PID_FILE /var/lib/rabbitmq/mnesia/rabbitmq

ADD init.sh /init.sh
RUN chmod +x /init.sh
EXPOSE 15672

# Define default command
CMD ["/init.sh"]

和 init.sh:

 #!/bin/sh

# Create Rabbitmq user
( rabbitmqctl wait --timeout 60 $RABBITMQ_PID_FILE ; \
rabbitmqctl add_user $RABBITMQ_USER $RABBITMQ_PASSWORD 2>/dev/null ; \
rabbitmqctl set_user_tags $RABBITMQ_USER administrator ; \
rabbitmqctl set_permissions -p / $RABBITMQ_USER  ".*" ".*" ".*" ; \
echo "*** User '$RABBITMQ_USER' with password '$RABBITMQ_PASSWORD' completed. ***" ; \
echo "*** Log in the WebUI at port 15672 (example: http:/localhost:15672) ***") &

# $@ is used to pass arguments to the rabbitmq-server command.
# For example if you use it like this: docker run -d rabbitmq arg1 arg2,
# it will be as you run in the container rabbitmq-server arg1 arg2
rabbitmq-server $@

此脚本还在端口 15672 处初始化和公开 RabbitMQ webadmin。

原文由 george.yord 发布,翻译遵循 CC BY-SA 4.0 许可协议

想出了一个适合我需要的解决方案,把它留在这里以防其他人需要它。

概括

这个想法是采用一个启用了管理插件的标准 rabbitmq 容器并使用它来创建所需的配置,然后导出并使用它来启动新容器。下面的解决方案创建了一个派生的 docker 映像,但它也可以在运行时挂载这两个文件(例如使用 docker compose)。

参考

成分

  • rabbitmq 官方镜像,管理插件版( rabbitmq:management

  • 基于原始图像的自定义图像,使用此 Dockerfile(使用版本 3.6.6):

    FROM rabbitmq:3.6.6-management
   ADD rabbitmq.config /etc/rabbitmq/
   ADD definitions.json /etc/rabbitmq/
   RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.config /etc/rabbitmq/definitions.json
   CMD ["rabbitmq-server"]

  • rabbitmq.config 只是告诉 rabbitmq 从 json 文件中加载定义

  • Definitions.json 包含用户、虚拟主机等,可以通过管理网页界面的导出功能生成

rabbitmq.config 示例:

 [
  {rabbit, [
    {loopback_users, []}
  ]},
  {rabbitmq_management, [
    {load_definitions, "/etc/rabbitmq/definitions.json"}
  ]}
].

定义.json 示例:

 {
 "rabbit_version": "3.6.6",
 "users": [
  {
   "name": "user1",
   "password_hash": "pass1",
   "hashing_algorithm": "rabbit_password_hashing_sha256",
   "tags": ""
  },
  {
   "name": "adminuser",
   "password_hash": "adminpass",
   "hashing_algorithm": "rabbit_password_hashing_sha256",
   "tags": "administrator"
  }
 ],
 "vhosts": [
  {
   "name": "\/vhost1"
  },
  {
   "name": "\/vhost2"
  }
 ],
 "permissions": [
  {
   "user": "user1",
   "vhost": "\/vhost1",
   "configure": ".*",
   "write": ".*",
   "read": ".*"
  }
 ],
 "parameters": [],
 "policies": [],
 "queues": [],
 "exchanges": [],
 "bindings": []
}

替代版本

派生一个新的 docker 镜像只是一种解决方案,当可移植性是关键时效果最好,因为它避免了在图片中包含基于主机的文件管理。

在某些情况下,使用官方映像并从本地存储提供配置文件到主机可能是首选。

rabbitmq.config 和 definitions.json 文件的生成方式相同,然后在运行时 _挂载_。

笔记:

  • 为了这些示例,我假设它们已放置在 /etc/so/ 中
  • 文件需要是世界可读的或由 rabbitmq 用户或组拥有(docker 容器内的数字 id 为 999),这需要由主机的系统管理员处理

码头运行 示例:

     docker run --rm -it \
        -v /etc/so/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro \
        -v /etc/so/definitions.json:/etc/rabbitmq/definitions.json:ro \
        rabbitmq:3.6-management

码头工人撰写 示例:

     version: '2.1'
    services:
        rabbitmq:
            image: "rabbitmq:3.6-management"
            ports:
                - 5672:5672
                - 15672:15672
            volumes:
                - /etc/so/rabbitmq.config:/etc/rabbitmq/rabbitmq.config:ro
                - /etc/so/definitions.json:/etc/rabbitmq/definitions.json:ro

原文由 sudo 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题