Предоставление файла rabbitmq.conf в файле-докере дает "sed: невозможно переименовать /etc/rabbitmq/sedMaHqMa: занято устройство или ресурс"

My docker-compose выглядит следующим образом:

version: '3.2'
services:
  mq:
    hostname: ${HOST_NAME}
    ports:
      - "5671:5671"
      - "5672:5672"
      - "15671:15671"
      - "15672:15672"
    environment:
      - RABBITMQ_DEFAULT_USER=${USER}
      - RABBITMQ_DEFAULT_PASS=${RABBITMQ_DEFAULT_PASS}
    volumes:
      - ${CACERT_PEM_FILE}:/etc/rabbitmq/certs/cacert.pem
      - ${CERT_PEM_FILE}:/etc/rabbitmq/certs/cert.pem
      - ${KEY_PEM_FILE}:/etc/rabbitmq/certs/key.pem
      - ${MQ_CONFIG_FILE}:/etc/rabbitmq/rabbitmq.conf
    image: rabbitmq:3-management

My rabbitmq.conf выглядит так:

listeners.tcp.default = 5672
listeners.ssl.default = 5671

ssl_options.cacertfile = /etc/rabbitmq/certs/cacert.pem
ssl_options.certfile = /etc/rabbitmq/certs/cert.pem
ssl_options.keyfile = /etc/rabbitmq/certs/key.pem
ssl_options.verify = verify_peer
ssl_options.fail_if_no_peer_cert = false

ssl_options.versions.1 = tlsv1.2
ssl_options.versions.2 = tlsv1.1

Однако, когда я пытаюсь выполнить docker-compose up, я получаю следующую ошибку:

cannot rename /etc/rabbitmq/sedMaHqMa: Device or resource busy

Я попытался использовать старый формат файла конфигурации (rabbitmq.config), и он не дал мне эту ошибку, однако мне нужно использовать новый формат, потому что мне нужен пароль, который будет предоставлен во время запуска через env. переменные.

EDIT 20 февраля 2018 года

Вот список доступных в настоящее время переменных среды в изображении докеры Rabbitmq, и их достаточно для установки TLS для AMQP и HTTP ( API управления и веб-консоль)

Копирование их в случае нарушения связи:

RABBITMQ_DEFAULT_PASS
RABBITMQ_DEFAULT_USER
RABBITMQ_DEFAULT_VHOST
RABBITMQ_ERLANG_COOKIE
RABBITMQ_HIPE_COMPILE
RABBITMQ_MANAGEMENT_SSL_CACERTFILE
RABBITMQ_MANAGEMENT_SSL_CERTFILE
RABBITMQ_MANAGEMENT_SSL_DEPTH
RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT
RABBITMQ_MANAGEMENT_SSL_KEYFILE
RABBITMQ_MANAGEMENT_SSL_VERIFY
RABBITMQ_SSL_CACERTFILE
RABBITMQ_SSL_CERTFILE
RABBITMQ_SSL_DEPTH
RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT
RABBITMQ_SSL_KEYFILE
RABBITMQ_SSL_VERIFY
RABBITMQ_VM_MEMORY_HIGH_WATERMARK

Ответ 1

Это похоже на проблему с текущим rabbitmq Dockerfile. Particulary sed команда, кажется, не работает должным образом на configfile, сопоставленном как том. Однако, так как у вас все равно есть контроль над rabbitmq.conf, почему бы не включить в этот файл имя пользователя и пароль по умолчанию

default_user = admin
default_pass = YourStrongPasswort

и удалите RABBITMQ_DEFAULT_USER и RABBITMQ_DEFAULT_PASS из вашего файла композиции. Это самый быстрый обходной путь, вероятно. Только что протестировал, у меня работает (официальный rabbitmq: 3.7-менеджмент).

Ответ 2

Я думаю, вы должны установить имя пользователя и пароль из переменной окружения или из определенного файла использовать флаг -f с - (тире) в качестве имени файла для чтения конфигурации из stdin.which содержит имя пользователя и пароль.

Ответ 3

Недавно я столкнулся с той же проблемой с изображением rabbitmq:3.7.8-management.

Я смог обойти эту проблему, предоставив advanced.config вместо rabbitmq.conf. advanced.config использует устаревший формат Erlang, кроме этого, он отлично сработал для меня. Я также предоставил RABBITMQ_* окружения RABBITMQ_*, так что это не проблема.

В моем случае я создавал кластер, но я считаю, что решение актуально для всех rabbitmq.conf использования до тех пор, пока rabbitmq.conf будет доступен rabbitmq.conf.