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

Posted

技术标签:

【中文标题】启动 RabbitMQ Docker 容器时如何添加初始用户?【英文标题】:How to add initial users when starting a RabbitMQ Docker container? 【发布时间】:2015-08-25 04:21:40 【问题描述】:

目前我正在使用来自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 图像时提供默认设置?

【问题讨论】:

【参考方案1】:

您可以创建一个简单的 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 网络管理员。

【讨论】:

cd /tmp ; \ wget http://localhost:15672/cli/rabbitmqadmin ; \ mv ./rabbitmqadmin /rabbitmqadmin ; \ chmod +x /rabbitmqadmin ; \ 我认为这些行可以删除,因为容器内已经可以使用 admin 命令。 @JanuszSkonieczny 也许你的行尾有问题?我只是再次尝试了说明,它成功了。 我收到此错误:/usr/local/bin/docker-entrypoint.sh:第 296 行:/init.sh:权限被拒绝。我错过了什么吗? 这真的有效吗?在 3.6.6 上,如果不先运行节点/应用程序,我将无法添加任何用户。看起来您是在运行 rabbitmq-server 之前添加它们。 关于sleep 5,如果你想要一个更可靠的方式来等待rabbitmq被初始化,我建议改用这个:rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbitmq.pid。我正在使用运行大量容器的 docker-compose,它对我有用。【参考方案2】:

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

总结

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

参考文献

the info I started from complete rabbitmq.config example

组件

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"
  ]
].

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

替代版本

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

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

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

注意事项:

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

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 compose 示例:

    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

【讨论】:

这是一个很好的解决方案。 @Tom.P 通过从 Rabbit 导出的定义对此进行了一些补充。将两者结合起来,这应该是公认的答案。这对我有用! @KentJohnson “definitions.json [...] 可以通过管理Web界面的导出功能生成”这一事实已经是我的观点之一,我也是这样做的(提供的示例只是为了立即获得一个想法) 添加了 chown 命令以确保权限正常(感谢@Tom P.)并添加了一个替代解决方案,该解决方案使用官方镜像 + 运行时挂载的配置文件 我发现这个密码哈希脚本对我也非常有用gist.github.com/lukebakken/7b4da46ed9abb7ed14f7a60b49f9e52e 很好的解决方案。主要问题是找到定义.json 的文档。但是您可以手动完成所有配置,然后导出定义medium.com/@thomasdecaux/…【参考方案3】:

RabbitMQ image on Dockerhub 的最新版本具有将默认用户名/密码从“guest”/“guest”更改为其他内容的内置功能。

启动镜像时只需设置环境变量“RABBITMQ_DEFAULT_USER”和“RABBITMQ_DEFAULT_PASS”即可。

作为 docker 命令,您可以像这样运行映像:

docker run \
-e RABBITMQ_DEFAULT_USER=test-user \
-e RABBITMQ_DEFAULT_PASS=test-user \
-p 5672:5672 \
rabbitmq

【讨论】:

不幸的是,似乎无法将其与定义文件结合起来:( 起初我认为这是不支持的,因为有“警告”的评论——但警告的实际变量不是这些。我添加了其他端口:-p 15672:15672 -p 15692:15692 - 但这个答案对我正在寻找的东西很有用 - 非常简单,易于传递给团队 - 谢谢!如果我没有阅读那个警告评论,它会为我节省一点时间!【参考方案4】:

我想补充一点,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 文件包含以下内容,这些内容是从默认图像的配置和加载的添加定义合并而来的:

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

        ]
    ]
].

定义文件可以从概览选项卡的管理界面中导出。

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

下载定义是在定义文件中为您自己的密码获取正确密码哈希的最简单方法。如果您不希望这样做,您应该按照此处 (https://www.rabbitmq.com/passwords.html) 中的说明生成正确的哈希值。

【讨论】:

我认为你有足够的内容来回答这个问题。所以宁愿删除所有阻止这成为答案的句子(比如说:应该是评论)。而comment-needs-50 规则的存在是有充分理由的。 对不起,那些声誉角色是一个痛点。有很多次我想在评论中贡献一些东西,点赞,我会得到“这需要 x 声誉”的信息。使开始贡献成为一个非常高的界限。无论如何,感谢您的评论,我已经进行了这些更改。 :) 问题是非常多的人在这里获得了帐户。他们中的太多人给出了关于质量的zip nada niente。只需 1,2 个广受好评的问题即可获得“投票”,1,2 个广受好评的答案就可以“发表评论”。 @TomP。推荐 Rabbit 的出口真是太好了。这真的节省了我的时间!它是完全准确的。这应该结合 sudo 的答案作为接受的答案。 我发现这个密码哈希脚本对我也很有用gist.github.com/lukebakken/7b4da46ed9abb7ed14f7a60b49f9e52e【参考方案5】:

使用 RabbitMQ 3.7 和较新的 rabbitmq.conf (sysctl) 配置格式,以下在 Docker 中使用默认用户和队列设置 RabbitMQ,您可以选择在 dockerfile 中添加以下 RUN 命令来创建用户。 ..

RUN rabbitmqctl add_user username password
RUN rabbitmqctl set_user_tags username administrator
RUN rabbitmqctl set_permissions ...

rabbitmq.conf

# Default user
default_user = testuser
default_pass = testpassword

## The default "guest" user is only permitted to access the server
## via a loopback interface (e.g. localhost).
loopback_users.guest = true

# IPv4
listeners.tcp.default = 5672

## HTTP listener and embedded Web server settings.
management.tcp.port = 15672

# Load queue definitions
management.load_definitions = /etc/rabbitmq/definitions.json

#Ignore SSL
ssl_options.verify               = verify_peer
ssl_options.fail_if_no_peer_cert = true

definitions.json


  "rabbit_version": "3.7.11",
  "users": [
    
      "name": "testuser",
      "password_hash": "txn+nsYVkAaIMvDsH8Fsyb3RWMCMWihRUVCk/wICL1NBKKvz",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": "administrator"
    
  ],
  "vhosts": [  "name": "test-vhost"  ],
  "permissions": [
    
      "user": "testuser",
      "vhost": "test-vhost",
      "configure": ".*",
      "write": ".*",
      "read": ".*"
    
  ],
  "topic_permissions": [],
  "parameters": [],
  "global_parameters": [
    
      "name": "cluster_name",
      "value": "rabbit@test-rabbit"
    
  ],
  "policies": [],
  "queues": [
    
      "name": "testqueue",
      "vhost": "test-vhost",
      "durable": true,
      "auto_delete": false,
      "arguments": 
    
  ],
  "exchanges": [],
  "bindings": []

Dockerfile

FROM rabbitmq:3.7-management

COPY rabbitmq.conf /etc/rabbitmq
COPY definitions.json /etc/rabbitmq

RUN ls /etc/rabbitmq
RUN cat /etc/rabbitmq/rabbitmq.conf

用于构建和运行容器的 Dockers 命令...

docker build -t rabbitmq-with-queue .
docker run --rm -it --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq-with-queue

【讨论】:

【参考方案6】:

在我的情况下,上面的sleep 5 解决方案不起作用,因为 RabbitMQ 启动时间要长得多且不可预测。发布等待 RabbitMQ 启动并运行的解决方案:

Dockerfile

FROM rabbitmq:3-management
ADD init.sh /
ADD config_rabbit.sh /
RUN chmod +x /init.sh /config_rabbit.sh
ENTRYPOINT ["/init.sh"]

init.sh

#!/bin/bash

# Launch config script in background
# Note there is no RabbitMQ Docker image support for executing commands after server (PID 1) is running (something like "ADD schema.sql /docker-entrypoint-initdb.d" in mysql image), so we are using this trick
/config_rabbit.sh &

# Launch
/docker-entrypoint.sh rabbitmq-server

config_rabbit.sh

#!/bin/bash

# This script needs to be executed just once
if [ -f /$0.completed ] ; then
  echo "$0 `date` /$0.completed found, skipping run"
  exit 0
fi

# Wait for RabbitMQ startup
for (( ; ; )) ; do
  sleep 5
  rabbitmqctl -q node_health_check > /dev/null 2>&1
  if [ $? -eq 0 ] ; then
    echo "$0 `date` rabbitmq is now running"
    break
  else
    echo "$0 `date` waiting for rabbitmq startup"
  fi
done

# Execute RabbitMQ config commands here

# Create user
rabbitmqctl add_user USER PASSWORD
rabbitmqctl set_permissions -p / USER ".*" ".*" ".*"
echo "$0 `date` user USER created"

# Create queue
rabbitmqadmin declare queue name=QUEUE durable=true
echo "$0 `date` queues created"

# Create mark so script is not ran again
touch /$0.completed

【讨论】:

【参考方案7】:

上述解决方案有一个警告:他们将“禁用”官方rabbit docker镜像中的docker-entrypoint.sh脚本present。这对您来说可能是也可能不是问题。此脚本创建初始 RabbitMQ 配置文件;添加一些好的默认值(例如,如果容器在内存限制下运行,则总内存限制)。

如果您想保持完全兼容性并且不想“禁用”此脚本,您可以使用以下方法。它将使用admin 密码添加一个额外的admin 用户,并保持guest 用户不变。这对开发很有用。

这种方法是使用definitions.json 文件来初始化使用管理插件的用户。为了通知插件definitions.json 文件,我们使用RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS 环境变量(而不是rabbitmq.conf 文件)。

创建definitions.json 文件:


  "users": [
    
      "name": "guest",
      "password_hash": "R184F4Fs6JLdo8tFqRjWnkJL2DlAZJupxEqkO/8kfV/G63+z",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": "administrator"
    ,
    
      "name": "admin",
      "password_hash": "FGA5ZeTOLHnIp4ZjxIj0PsShW/DpLgdYAlHsbli7KMMa8Z0O",
      "hashing_algorithm": "rabbit_password_hashing_sha256",
      "tags": "administrator"
    
  ],
  "vhosts": [
    
      "name": "/"
    
  ],
  "permissions": [
    
      "user": "guest",
      "vhost": "/",
      "configure": ".*",
      "write": ".*",
      "read": ".*"
    ,
    
      "user": "admin",
      "vhost": "/",
      "configure": ".*",
      "write": ".*",
      "read": ".*"
    
  ],
  "parameters": [],
  "policies": [],
  "queues": [],
  "exchanges": [],
  "bindings": []


创建自定义Dockerfile

FROM rabbitmq:3.8.3-management

ADD --chown=rabbitmq ./definitions.json /etc/rabbitmq/

ENV RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbitmq_management load_definitions \"/etc/rabbitmq/definitions.json\""

使用以下命令构建镜像: docker build --tag myrabbit:1.0.0 .

然后运行它: docker run -d -p 5672:5672 -p 15672:15672 --restart unless-stopped --name rabbitmq myrabbit:1.0.0

【讨论】:

谢谢。这对我有用,环境变量是关键【参考方案8】:

在 Kubernetes 中,类似于@sudo 的回答;可以通过 ConfigMap & Volume 将 definitions.json 文件加载到容器中。

ConfigMap rabbitmq-definitions-configmap 被定义为从文件创建的配置图,目标是 definitions.json。

您也可以对 rabbitmq.config 文件执行相同的操作。

请注意mountPathsubPath 的用法,仅使用mountPath 对我不起作用。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq-deployment
spec:
  selector:
    matchLabels:
      app: rabbitmq-deployment
  replicas: 1
  template:
    metadata:
      labels:
        app: rabbitmq-deployment
    spec:
      volumes:
      - name: rabbitmq-definitions
        configMap:
          name: rabbitmq-definitions-configmap
      containers:
      - name: rabbitmq
        image: rabbitmq:3.7.18-management-alpine
        imagePullPolicy: IfNotPresent
        envFrom:
        - configMapRef:
            name: rabbitmq-configmap
        - secretRef:
            name: rabbitmq-secrets
        volumeMounts:
        - name: rabbitmq-definitions
          mountPath: /etc/rabbitmq/definitions.json
          subPath: rabbitmq-definitions

【讨论】:

完美的建议,谢谢。我将此想法与 configmap 上的 kubernetes 文档(不知道此功能)一起使用,通过在 /etc/rabbitmq/conf.d/ 下保存文件来增加我的 rabbitmq 服务器的心跳。但我不需要使用 subPath。非常感谢您的贡献【参考方案9】:

我必须对已接受答案中的脚本进行一些更改,才能根据上面的 cmets 使其正常工作。

Dockerfile

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
( sleep 10 && \
rabbitmqctl add_user $RABBITMQ_USER $RABBITMQ_PASSWORD && \
rabbitmqctl set_user_tags $RABBITMQ_USER administrator && \
rabbitmqctl set_permissions -p / $RABBITMQ_USER  ".*" ".*" ".*" ) & \
rabbitmq-server

【讨论】:

【参考方案10】:

就我而言,我想知道是否可以通过简单地挂载数据文件夹来转储 docker 容器 user/vhost/data。

我找到了以下文档:https://www.rabbitmq.com/backup.html,帮助太大了。


目前,我确实将/var/lib/rabbitmq 卷挂载到主机,但是当重新创建容器时,用户和虚拟主机的配置消失了。

我意识到在重新创建容器后,会生成一个具有不同 ID 的新数据集。

所以旧数据还在,只是id断开了。

在我的示例中,0df72ae1a7a5 是旧的,当我创建一个新的 268bac197c69 时,旧数据不再处于活动状态。

root@268bac197c69:~/mnesia# ls -alh /var/lib/rabbitmq/mnesia
total 100K
drwxr-xr-x. 14 rabbitmq rabbitmq 4.0K Jun 13 13:43 .
drwxr-xr-x.  5 rabbitmq root     4.0K Jun 13 13:42 ..
drwxr-xr-x.  4 rabbitmq rabbitmq 4.0K Mar  6  2020 rabbit@0df72ae1a7a5
-rw-r--r--.  1 rabbitmq rabbitmq   64 Mar  6  2020 rabbit@0df72ae1a7a5-feature_flags
drwxr-xr-x.  2 rabbitmq rabbitmq 4.0K Mar  6  2020 rabbit@0df72ae1a7a5-plugins-expand
-rw-r--r--.  1 rabbitmq rabbitmq    2 Mar  6  2020 rabbit@0df72ae1a7a5.pid
drwxr-xr-x.  4 rabbitmq rabbitmq 4.0K Jun 13 13:43 rabbit@268bac197c69
-rw-r--r--.  1 rabbitmq rabbitmq  148 Jun 13 13:43 rabbit@268bac197c69-feature_flags
drwxr-xr-x. 10 rabbitmq rabbitmq 4.0K Jun 13 13:43 rabbit@268bac197c69-plugins-expand
-rw-r--r--.  1 rabbitmq rabbitmq    3 Jun 13 13:43 rabbit@268bac197c69.pid

在容器中,以下命令显示当前活动的id:

rabbitmqctl eval 'rabbit_mnesia:dir().'

它打印"/var/lib/rabbitmq/mnesia/rabbit@268bac197c69",当前新创建的。

所以现在问题归结为:

容器重新创建时如何恢复具有特定旧id的旧数据?

很快,我发现当前id和容器hostname是一样的,是容器创建时随机生成的!

那么如何将 id 粘贴到特定值呢?我查看了 docker-hub rabbitmq 页面:https://hub.docker.com/_/rabbitmq

关于 RabbitMQ 需要注意的重要一点是,它基于所谓的“节点名称”存储数据,默认为主机名。这对于 Docker 的使用意味着我们应该为每个守护进程显式指定 -h/--hostname,这样我们就不会得到一个随机的主机名并且可以跟踪我们的数据:

最终解决方案来了,我们只需要将hostname指定为特定值,容器重新创建时一切都会自动恢复。


最终解决方案:

只需在我们的 docker-compose 部分添加主机名设置:

注意:主机名行和卷行很重要。

  rabbitmq:
    image: rabbitmq:management
    container_name: rabbitmq
    restart: always
    hostname: 0df72ae1a7a5
    environment:
     RABBITMQ_DEFAULT_USER: rabbit
     RABBITMQ_DEFAULT_PASS: rabbit
    volumes:
     - /var/docker/rabbitmq/var/lib/rabbitmq:/var/lib/rabbitmq

【讨论】:

【参考方案11】:

这里的一些其他解决方案不适用于 TLS,因为它们禁用了父入口点。其他的有不必要的步骤,因为父图像有一个未记录的功能,如果它存在于 /etc/rabbitmq 下,它将消耗一个定义.json。

这似乎是最简单的方法:

Dockerfile

FROM rabbitmq:3.8.2-management
ADD definitions.json /etc/rabbitmq/
RUN chown rabbitmq:rabbitmq /etc/rabbitmq/definitions.json

definitions.json - 编辑以满足您的用户/虚拟主机/权限需求


"users": [
    
    "name": "guest",
    "password_hash": "R184F4Fs6JLdo8tFqRjWnkJL2DlAZJupxEqkO/8kfV/G63+z",
    "hashing_algorithm": "rabbit_password_hashing_sha256",
    "tags": "administrator"
    ,
    
    "name": "admin",
    "password_hash": "FGA5ZeTOLHnIp4ZjxIj0PsShW/DpLgdYAlHsbli7KMMa8Z0O",
    "hashing_algorithm": "rabbit_password_hashing_sha256",
    "tags": "administrator"
    
],
"vhosts": [
    
    "name": "/"
    
],
"permissions": [
    
    "user": "guest",
    "vhost": "/",
    "configure": ".*",
    "write": ".*",
    "read": ".*"
    ,
    
    "user": "admin",
    "vhost": "/",
    "configure": ".*",
    "write": ".*",
    "read": ".*"
    
],
"parameters": [],
"policies": [],
"queues": [],
"exchanges": [],
"bindings": []

【讨论】:

【参考方案12】:

通过 Dockerfile 指令在自定义映像上使用 cron 对我有用:

# add rabbitmq user with /usr/sbin/rabbitmqctl at boot time.
RUN  echo "@reboot  root  sleep 5 && rabbitmqctl add_user admin admin && rabbitmqctl set_user_tags admin administrator && rabbitmqctl set_permissions -p / admin \".*\" \".*\" \".*\"" >> /etc/crontab

该映像基于 Rocky Linux 和 Systemd。这是我的完整 Dockerfile:

FROM rockylinux/rockylinux:latest
LABEL maintainer="acool@example.com"

# remove unecessary systemd unit files
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;

# import rabbitmq repo signatures
RUN rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc && \
rpm --import 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key' && \
rpm --import 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key'

# copy rabbitmq repo config
COPY config/rabbitmq.repo /etc/yum.repos.d/rabbitmq.repo

# install packages
RUN dnf -y update \
&& dnf -y install epel-release.noarch \
http://rpms.remirepo.net/enterprise/remi-release-8.rpm \
&& dnf module -y install php:remi-8.0 \
&& dnf -y install rabbitmq-server \
supervisor \
memcached \
iproute \
# postfix \
mailx \
vim \
nano \
dos2unix \
wget \
openssh \
rsync \
unzip \
ImageMagick \
ncurses \
cronie \
&& dnf clean all

# create admin user account
ARG UID=1000
RUN useradd --create-home --uid $UID admin

# enable services
RUN systemctl enable rabbitmq-server.service memcached.service \
&& rabbitmq-plugins enable rabbitmq_management

# add rabbitmq user with /usr/sbin/rabbitmqctl at boot time.
RUN  echo "@reboot  root  sleep 5 && rabbitmqctl add_user admin admin && rabbitmqctl set_user_tags admin administrator && rabbitmqctl set_permissions -p / admin \".*\" \".*\" \".*\"" >> /etc/crontab

EXPOSE 15672 9001
ENTRYPOINT ["/sbin/init"]

构建镜像:

docker build --build-arg UID=$(id -u) -t customRockyLinux:customRockyLinux .

运行镜像:

docker run  --name customRL_container -d --privileged -p 15672:15672 -p 9001:9001 customRockyLinux:customRockyLinux

以 root 身份与容器交互:

docker exec -it customRL_container bash

或作为特定用户:

docker exec -it --user admin customRL_container bash

验证 RabbitMQ 用户:

root@a2dc7498de45 /]# rabbitmqctl list_users
user    tags
admin   [administrator]
guest   [administrator]
[root@a2dc7498de45 /]#
[root@a2dc7498de45 /]#
[root@a2dc7498de45 /]# rabbitmqctl --version
3.9.5
[root@a2dc7498de45 /]# cat /etc/redhat-release 
Rocky Linux release 8.4 (Green Obsidian)

祝你好运!

【讨论】:

【参考方案13】:

创建两个文件夹,dataetc

enabled_plugins

[rabbitmq_management,rabbitmq_prometheus].

rabbitmq.conf

    auth_mechanisms.1 = PLAIN
    auth_mechanisms.2 = AMQPLAIN
    loopback_users.guest = false
    listeners.tcp.default = 5672
    #default_pass = admin
    #default_user = admin
    hipe_compile = false
    #management.listener.port = 15672
    #management.listener.ssl = false
    management.tcp.port = 15672
    management.load_definitions = /etc/rabbitmq/definitions.json

definitions.json 您可以根据需要添加任意数量的用户、队列、交换器

  
    "users": [
        
        "name": "admin",
        "password": "admin",
        "tags": "administrator"
        
    ],
    "vhosts": [
        
        "name": "/"
        
    ],
    "policies": [
        
        "vhost": "/",
        "name": "ha",
        "pattern": "",
        "apply-to": "all",
        "definition": 
            "ha-mode": "all",
            "ha-sync-batch-size": 256,
            "ha-sync-mode": "automatic"
        ,
        "priority": 0
        
    ],
    "permissions": [
        
        "user": "admin",
        "vhost": "/",
        "configure": ".*",
        "write": ".*",
        "read": ".*"
        
    ],
    "queues": [
        
        "name": "job-import.triggered.queue",
        "vhost": "/",
        "durable": true,
        "auto_delete": false,
        "arguments": 
        
    ],
    "exchanges": [
        
        "name": "lob-proj-dx",
        "vhost": "/",
        "type": "direct",
        "durable": true,
        "auto_delete": false,
        "internal": false,
        "arguments": 
        
    ],
    "bindings": [
        
        "source": "lob-proj-dx",
        "vhost": "/",
        "destination": "job-import.triggered.queue",
        "destination_type": "queue",
        "routing_key": "job-import.event.triggered",
        "arguments": 
        
    ]
  

跑兔子

docker run --restart=always -d -p 5672:5672 -p 15672:15672 --mount type=bind,source=E:\docker\rabbit\data,target=/var/lib/rabbitmq/ --mount type=bind,source=E:\docker\rabbit\etc,target=/etc/rabbitmq/ --name rabbitmq --hostname my-rabbit rabbitmq:3.7.28-management

取自here

这种方法不需要创建自定义 docker 映像,不需要 docker-compose,而且它会在重启时保持状态

【讨论】:

【参考方案14】:

这是我如何添加非特权用户 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 的示例

【讨论】:

以上是关于启动 RabbitMQ Docker 容器时如何添加初始用户?的主要内容,如果未能解决你的问题,请参考以下文章

rabbitmq容器启动成功,docker ps 找不到rabbitmq

rabbitmq容器启动成功,docker ps 找不到rabbitmq

如何通过docker部署RabbitMQ?(保姆级教程)

Docker Compose 在启动 Y 之前等待容器 X

docker中启动rabbitmq命令

node.js,Rabbitmq和Docker:使用seneca的服务似乎在rabbitmq之前启动