如何在启动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 

我有一个需要在图像第一次启动时提供默认用户/和虚拟主机的地方。 例如创build一个默认的“testing用户”。

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

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

 FROM rabbitmq # Define environment variables. ENV RABBITMQ_USER user ENV RABBITMQ_PASSWORD user ADD init.sh /init.sh EXPOSE 15672 # Define default command CMD ["/init.sh"] 

和init.sh:

 #!/bin/sh # Create Rabbitmq user ( sleep 5 ; \ 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。

提出一个适合我需求的解决scheme,留在这里以防别人需要。

概要

这个想法是采用一个pipe理插件启用的标准rabbitmq容器,并使用它来创build所需的configuration,然后导出并使用它启动新的容器。 下面的解决scheme创build了一个派生的docker镜像,但是它也可以在运行时安装这两个文件(比如使用docker compose)。

参考

  • 从我开始的信息
  • 完成rabbitmq.config的例子

组件

  • 官方rabbitmq镜像,pipe理插件版本( rabbitmq:pipe理
  • 自定义图像基于原来的,与此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包含用户,虚拟主机等,可以通过pipe理Web界面的导出function生成

rabbitmq.config例子:

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

definitions.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": [] } 

Alternave版本

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

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

rabbitmq.config和definitions.json文件的生成方式相同,然后在运行时进行安装

笔记:

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

docker运行示例:

  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 

docker工人组成的例子:

  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的回复帮了我很多。 但是它仍然错过了添加到Dockerfile的命令。

rabbitmq.config和definitions.json文件应该由rabbitmq用户和组拥有。 所以在添加文件后运行chown。

在我的情况下,完整的Dockerfile是以下内容:

 FROM rabbitmq:3-management-alpine ADD definitions.json /etc/rabbitmq/ ADD rabbitmq.config /etc/rabbitmq/ RUN chown rabbitmq:rabbitmq /etc/rabbitmq/rabbitmq.config /etc/rabbitmq/definitions.json EXPOSE 4369 5671 5672 15671 15672 25672 CMD ["rabbitmq-server"] 

rabbitmq.config文件具有以下内容:默认图像的configuration和添加的定义加载:

 [ { rabbit, [ {loopback_users, []}, { tcp_listeners, [ 5672 ]}, { ssl_listeners, [ ]}, { hipe_compile, false } ]}, { rabbitmq_management, [ { load_definitions, "/etc/rabbitmq/definitions.json"}, { listeners, [ { port, 15672 }, { ssl, false } ]} ]} ]. 

定义文件可以从总览选项卡的pipe理界面导出。

所以你首先要创build一个普通的'空'rabbitmq容器。 定义你喜欢的任何用户,交换和队列。 然后进入pipe理界面,导出定义并使用上述文件创build自己的图像。

下载定义是在定义文件中为自己的密码获取正确密码散列的最简单方法。 如果你不希望这样做,你应该按照这里( https://www.rabbitmq.com/passwords.html )所述的指示来生成正确的哈希值。

这里是我如何添加一个非特权用户的例子gg RUN useradd -d /home/gg -m -s /bin/bash gg RUN echo gg:gg | chpasswd RUN echo 'gg ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/gg RUN chmod 0440 /etc/sudoers.d/gg RUN useradd -d /home/gg -m -s /bin/bash gg RUN echo gg:gg | chpasswd RUN echo 'gg ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/gg RUN chmod 0440 /etc/sudoers.d/gg

您可以创build一个新的映像并使用rabbitmqctl命令行。

例如使用这个Dockerfile:

 FROM rabbitmq # rabbitmqctl command requires to start the rabbitmq server RUN service rabbitmq-server start RUN /usr/lib/rabbitmq/bin/rabbitmqctl add_user test-user mypassword RUN /usr/lib/rabbitmq/bin/rabbitmqctl add_vhost myvhost RUN /usr/lib/rabbitmq/bin/rabbitmqctl set_permissions -p /myvhost test-user ".*" ".*" ".*" 

并使用build立图像

 sudo docker build -t anImageName . 

我没有testing我的答案,我不能在工作中使用docker工人