現在、 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イメージの起動時にデフォルト設定を提供する方法はありますか?
基本的なイメージの機能を拡張し、デフォルトのユーザーを作成する単純な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を初期化して公開します。
私のニーズに合ったソリューションを見つけて、他の誰かがそれを必要とする場合に備えてここに残してください。
管理プラグインが有効になっている標準のrabbitmqコンテナーを使用し、それを使用して必要な構成を作成し、それをエクスポートして使用して新しいコンテナーを開始するという考え方です。以下のソリューションは、派生ドッカーイメージを作成しますが、実行時に2つのファイルをマウントするだけでも機能します(例:docker composeを使用)。
この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例:
[
{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イメージの派生は1つのソリューションにすぎず、移植性が重要な場合に最適です。これは、ホストベースのファイル管理を写真に含めないためです。
状況によっては、公式イメージを使用して、ホストのローカルストレージから構成ファイルを提供することが推奨される場合があります。
Rabbitmq.configファイルとdefinition.jsonファイルは同じ方法で作成され、実行時にmountedになります。
ノート:
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
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
須藤の反応が私を大いに助けたと付け加えたい。ただし、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 )に従って正しいハッシュを生成する必要があります。
私の場合 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
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
上記のコメントに基づいてスクリプトを機能させるには、受け入れられた回答のスクリプトにいくつかの変更を加える必要がありました。
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
以下は、非特権ユーザー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
を追加する方法の例です。