【问题标题】:Persisting RabbitMQ Configuration in Docker Image在 Docker 镜像中持久化 RabbitMQ 配置
【发布时间】:2014-02-28 21:50:17
【问题描述】:

在 Docker 镜像中配置 RabbitMQ 是一场噩梦。当使用 Fig 将 RabbitMQ 作为链接容器运行时,我可以连接到 RabbitMQ 接口,并成功配置 vhosts 和权限,让我的 Celery 工作人员可以毫无问题地连接。

但是,重新启动 Docker 会丢失配置设置。如何保留这些设置?

我尝试过的一些事情:

  • 在配置完所有内容后,将/etc/rabbitmq/rabbit.config 从导出中写入 Docker 映像。 RabbitMQ 会忽略它。
  • 在我的 Docker 文件中使用ENV HOSTNAME localhost 设置主机名,但这似乎会干扰图中链接 Docker 容器。

我做错了什么?是否有一个规范的 Dockerfile 用于获取配置的 RabbitMQ docker 容器用于 Docker 链接开发目的,最好使用 Fig ?

【问题讨论】:

  • rabbitmq-server 是否报告任何错误?通常它很吵:)
  • 如果我每次都手动配置 RabbitMQ,客户端连接没有问题。但是,如果我尝试在 Docker 运行之间保持配置,我的 Celery 客户端会抱怨由于缺少虚拟主机而使用密码“guest”连接到 amqp://guest@<linked_docker_hostname>/<vhost>

标签: rabbitmq docker


【解决方案1】:

正如ben 提到的here

这个问题似乎是由于每个带有 Docker 的新容器的默认主机名都发生了变化,而 RabbitMQ 实际上将配置绑定到了主机名。

所以关键是设置主机名

这是一个使用 docker-compose 的解决方案:

version: '3'
services:
  rabbitmq:
    image: rabbitmq:management
    hostname: qsearchmq    # specify your hostname here
    volumes:
      - rabbitmq:/var/lib/rabbitmq    # use a volume to store the data
volumes:
  rabbitmq:
    driver: local

【讨论】:

    【解决方案2】:

    这是一个旧帖子,但值得回答。很明显,您没有在容器退出后提交您的容器。即使你是,问题也可能是你正在启动一个香草容器,而不是之前提交的版本。查找“docker commit”和“docker start”,对比“docker run”。

    还要注意 Docker 在将容器耦合到主机时会创建临时端口。当您需要与容器内的套接字通信时,客户端需要与之通信的配置可能会有所不同 - 例如,每次重新启动已提交的 RabbitMQ 容器时,客户端需要使用的容器的端口号可能会发生变化.容器端口到临时主机端口的双向映射。这意味着它主要是必须补偿的主机。当然,除非您使用 -p 选项,或者在 Dockerfile 中正确配置 EXPOSE,如果您使用的是自定义选项。你用的是一个,对吧?

    【讨论】:

    • 我的问题是两年前的问题,所以我不记得所有上下文,但我想(并且仍然更喜欢)配置一个 vanilla Docker RabbitMQ 映像,使用 EXPORT 挂载配置文件并启动容器,而不是制作包含配置机密的图像。重读我的问题,似乎问题与虚拟主机更相关。它甚至可能在更新版本的 Docker 中得到修复。
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    相关资源
    最近更新 更多