dockerrabbitmq

How to add initial users when starting a RabbitMQ Docker container?


Currently i am starting RabbitMQ Docker container using the default RabbitMQ image from DockerHub. Using the following commands.

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

I have a need where i want to provide defaults users / and virtual-hosts when the image is first started. For example to create a default 'test-user'.

Currently i have to do that manually by using the management plugin and adding the users / virtual-hosts via the web ui. Is there a way i can provide default settings when starting the RabbitMQ image?


Solution

  • You can create a simple Dockerfile that extends the functionality of the basic image and creates a default user. The Docker file you need is the following:

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

    And the 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 $@
    

    This script also initialize and expose the RabbitMQ webadmin at port 15672.