web-dev-qa-db-ja.com

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イメージの起動時にデフォルト設定を提供する方法はありますか?

41
Marco

基本的なイメージの機能を拡張し、デフォルトのユーザーを作成する単純なDockerfileを作成できます。必要な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を初期化して公開します。

44
george.yord

私のニーズに合ったソリューションを見つけて、他の誰かがそれを必要とする場合に備えてここに残してください。

概要

管理プラグインが有効になっている標準のrabbitmqコンテナーを使用し、それを使用して必要な構成を作成し、それをエクスポートして使用して新しいコンテナーを開始するという考え方です。以下のソリューションは、派生ドッカーイメージを作成しますが、実行時に2つのファイルをマウントするだけでも機能します(例: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は、jsonファイルから定義をロードするようにrabbitmqに指示するだけです
  • definitions.jsonはユーザー、仮想ホストなどを含み、管理Webインターフェースのエクスポート機能によって生成できます

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イメージの派生は1つのソリューションにすぎず、移植性が重要な場合に最適です。これは、ホストベースのファイル管理を写真に含めないためです。

状況によっては、公式イメージを使用して、ホストのローカルストレージから構成ファイルを提供することが推奨される場合があります。

Rabbitmq.configファイルとdefinition.jsonファイルは同じ方法で作成され、実行時にmountedになります。

ノート:

  • これらの例のために/ etc/so /に配置されていると仮定しています
  • ファイルは誰でも読み取り可能であるか、rabbitmqユーザーまたはグループが所有している必要があります(dockerコンテナー内の数値IDは999です)。これはホストのシステム管理者が処理する必要があります。

docker run例:

    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
48
sudo

DockerhubのRabbitMQイメージ の最新バージョンには、デフォルトのユーザー名/パスワードを「guest」/「guest」から別のものに変更するための組み込み機能があります。

イメージを開始するときに、環境変数「RABBITMQ_DEFAULT_USER」と「RABBITMQ_DEFAULT_PASS」を設定するだけです。

ドッカーコマンドとして、次のように画像を実行します。

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

須藤の反応が私を大いに助けたと付け加えたい。ただし、Dockerfileに追加するコマンドがまだ欠落していること。

Rabbitmq.configおよびdefinition.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 )に従って正しいハッシュを生成する必要があります。

10
Tom P.

私の場合 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
    
4
Martin

RabbitMQ 3.7、およびより新しいrabbitmq.conf( sysctl )構成フォーマットを使用すると、Dockerでデフォルトのユーザーとキューを使用してRabbitMQをセットアップし、オプションで次のRUNコマンドをdockerfileに追加して作成できますユーザー...

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

definition.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

コンテナを構築して実行するドッカーコマンド...

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

上記のコメントに基づいてスクリプトを機能させるには、受け入れられた回答のスクリプトにいくつかの変更を加える必要がありました。

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
0
Fiacc

以下は、非特権ユーザー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を追加する方法の例です。

0
user2915097