【问题标题】:How to add initial users when starting a RabbitMQ Docker container?启动 RabbitMQ Docker 容器时如何添加初始用户?
【发布时间】: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 图像时提供默认设置?

【问题讨论】:

    标签: docker 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)。

    参考文献

    组件

    • 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 的示例

                  【讨论】:

                    猜你喜欢
                    • 2016-12-04
                    • 2019-12-29
                    • 2023-03-05
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-02-26
                    相关资源
                    最近更新 更多