在docker compose文件中提供rabbitmq.conf会给出;sed:无法重命名/etc/rabbitmq/sedMaHqMa:Device或resource busy“;

在docker compose文件中提供rabbitmq.conf会给出;sed:无法重命名/etc/rabbitmq/sedMaHqMa:Device或resource busy“;,rabbitmq,docker-compose,config,Rabbitmq,Docker Compose,Config,我的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_DEF

我的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
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
我的rabbitmq.conf如下所示:

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
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
时,我得到以下错误:

无法重命名/etc/rabbitmq/sedMaHqMa:设备或资源繁忙

我尝试使用旧格式的配置文件(rabbitmq.config),但它没有给我这个错误,但是我需要使用新格式,因为我需要在启动过程中通过env提供密码。变量

编辑2018年2月20日

以下是Rabbitmq docker映像中当前可用的环境变量列表,它们足以为AMQP和HTTP(管理API和Web控制台)设置TLS

复制它们以防链接断开:

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

这似乎是当前rabbitmq的一个问题 Dockerfile。特定的sed命令似乎无法在映射为卷的configfile上正常工作。但是,既然您可以控制
rabbitmq.conf
文件,为什么不将默认用户和密码包含在此文件中

default_user = admin
default_pass = YourStrongPasswort
从撰写文件中删除RABBITMQ\u DEFAULT\u用户和RABBITMQ\u DEFAULT\u传递。
这可能是最快的工作。刚刚测试过,适合我(官方rabbitmq:3.7-management)。

我认为您必须从环境变量或特定文件中设置用户名和密码,使用
-f
标志,并使用-(破折号)作为文件名,以便从包含用户名和密码的stdin.读取配置

我最近在
rabbitmq:3.7.8-management
image上遇到了同样的问题

我通过提供
advanced.config
而不是
rabbitmq.conf
解决了这个问题。
advanced.config
使用传统的Erlang格式,除此之外,它对我来说非常适合。 我还提供了
RABBITMQ.*
环境变量,所以这不是问题


在我的例子中,我创建了一个集群,但我相信该解决方案目前适用于所有用例,直到
rabbitmq.conf
可用。

感谢您的回复和3.7的测试。最后,我可能会采用您提出的解决方案,但理想的做法不是将密码硬编码到配置文件中,而是在.env中指定密码-这对ops团队进行部署更容易-他们只需要
docker compose
。我甚至更愿意重写Docker文件并构建自己的映像,如果它有助于解决问题的话。然而,在我看来,Rabbitmq只支持通过
-e
.conf
文件传递的环境变量。不是同时提供这两个参数。最后,我通过环境变量提供了所有SSL参数,包括用户名和密码,所以我设法避免在*.conf文件中硬编码这些值,而只是在.env文件中提供它们。还有SSL选项吗?一切都可以定义为ENV吗?我只想知道。在我的问题中添加了一个可用环境变量列表,可用于为AMQP和HTTP设置TLS。无法用于开放源代码项目,因为您无法将机密放入conf。您知道是否可以通过在advanced.config中提供相同的键来覆盖rabbitmq.conf中定义的值吗。如果没有,您知道如何在高级配置中指定TLS版本吗?