You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker-Compose挂载RabbitMQ新格式配置文件遇设备忙错误

解决RabbitMQ Docker镜像挂载新格式配置文件时的"Device or resource busy"错误

我来帮你搞定这个问题——你遇到的这个错误其实是RabbitMQ官方Docker镜像的启动逻辑导致的:镜像的entrypoint脚本会尝试对/etc/rabbitmq/rabbitmq.conf做修改(比如用sed替换配置占位符),但sed的工作方式是先生成临时文件,再重命名替换原文件。当你直接把本地的rabbitmq.conf文件挂载到容器里的这个路径时,这个挂载的文件处于"资源占用"状态,容器没法完成重命名操作,所以就抛出了"Device or resource busy"的错误。而旧格式的rabbitmq.config没这个问题,是因为镜像对旧配置文件的处理逻辑不一样。

既然你需要用环境变量传递密码,同时要配置TLS,完全不用硬扛着挂载配置文件的问题——RabbitMQ官方镜像已经提供了现成的环境变量来配置这些内容,直接用这些变量就行:

修改后的docker-compose.yml配置

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}
      
      # AMQP服务的TLS配置(对应你原来rabbitmq.conf里的内容)
      - RABBITMQ_SSL_CACERTFILE=/etc/rabbitmq/certs/cacert.pem
      - RABBITMQ_SSL_CERTFILE=/etc/rabbitmq/certs/cert.pem
      - RABBITMQ_SSL_KEYFILE=/etc/rabbitmq/certs/key.pem
      - RABBITMQ_SSL_VERIFY=verify_peer
      - RABBITMQ_SSL_FAIL_IF_NO_PEER_CERT=false
      - RABBITMQ_SSL_VERSIONS=tlsv1.1,tlsv1.2
      
      # 管理控制台的TLS配置(如果需要启用HTTPS访问控制台的话)
      - RABBITMQ_MANAGEMENT_SSL_CACERTFILE=/etc/rabbitmq/certs/cacert.pem
      - RABBITMQ_MANAGEMENT_SSL_CERTFILE=/etc/rabbitmq/certs/cert.pem
      - RABBITMQ_MANAGEMENT_SSL_KEYFILE=/etc/rabbitmq/certs/key.pem
      - RABBITMQ_MANAGEMENT_SSL_VERIFY=verify_peer
      - RABBITMQ_MANAGEMENT_SSL_FAIL_IF_NO_PEER_CERT=false
      - RABBITMQ_MANAGEMENT_SSL_VERSIONS=tlsv1.1,tlsv1.2
    volumes:
      # 把存放证书的整个目录挂载进去,不用单独挂每个证书文件
      - ${CERTS_DIR}:/etc/rabbitmq/certs
    image: rabbitmq:3-management

额外说明:如果需要自定义更多配置

要是你除了TLS和认证,还需要加其他自定义配置,可以把你的rabbitmq.conf放在一个本地目录里(比如./rabbitmq-conf),然后挂载这个目录到容器的/etc/rabbitmq/conf.d路径——镜像会自动加载这个目录下的所有配置文件,而且不会修改你的自定义文件,这样也能避开资源忙的问题:

volumes:
  - ./rabbitmq-conf:/etc/rabbitmq/conf.d
  - ${CERTS_DIR}:/etc/rabbitmq/certs

这样改完之后,再跑docker-compose up就不会再出现那个烦人的错误了,环境变量传的密码也能正常生效,TLS配置也完全符合你的要求。

内容的提问来源于stack exchange,提问作者Kirill G.

火山引擎 最新活动