RabbitMQ Docker 容器错误:读取 /var/lib/rabbitmq/.erlang.cookie 时出错:eacces

问题描述 投票:0回答:2

我在 Windows Server 1709(Windows Server 核心版)上的 Docker 中运行

rabbitmq
时遇到问题。

我正在使用 docker-compose 创建rabbitmq服务。如果我在本地计算机上运行 docker-compose,一切正常。当我在 Windows 服务器上运行 docker-compose 时(其中 docker 已设置为 Windows 上的 docker lcow 支持),我在日志中多次出现上述错误。即这个错误是:

读取 /var/lib/rabbitmq/.erlang.cookie 时出错:eacces

值得注意的是,即使我只是手动拉动rabbitmq并使用

docker run -itd --rm --name rabbitmq rabbitmq:3-management

手动运行,我也会收到此错误

我能够在容器崩溃并退出之前猛击容器一小会儿,并且看到以下内容:

root@localhost:~# ls -la
---------- 2 root root   20 Jan  5 12:18 .erlang.cookie

在我的本地主机上,权限如下所示(这是正确的):

root@localhost:~# ls -la 
-r-------- 1 rabbitmq rabbitmq   20 Dec 28 00:00 .erlang.cookie

我不明白为什么服务器上的权限结构被破坏。

这是否可能是 Windows Server 1709 上使用 Docker for Windows 的 LCOW 支持的问题?还是rabbitmq的问题?

这里使用的 docker compose 文件可供参考:

version: "3.3"
services:

  rabbitmq:
    image: rabbitmq:3-management
    container_name: rabbitmq
    hostname: localhost
    ports: 
      - "1001:5672"
      - "1002:15672"
    environment:
      - "RABBITMQ_DEFAULT_USER=user"
      - "RABBITMQ_DEFAULT_PASS=password"
    volumes:
      - d:/docker_data/rabbitmq:/var/lib/rabbitmq/mnesia
    restart: always

这里是发生错误的 docker 信息供参考。

docker info

Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 1
Server Version: 17.10.0-ee-preview-3
Storage Driver: windowsfilter (windows) lcow (linux)
 LCOW:
Logging Driver: json-file
Plugins:
 Volume: local
 Network: ics l2bridge l2tunnel nat null overlay transparent
 Log: awslogs etwlogs fluentd json-file logentries splunk syslog
Swarm: inactive
Default Isolation: process
Kernel Version: 10.0 16299 (16299.15.amd64fre.rs3_release.170928-1534)
Operating System: Windows Server Datacenter
OSType: windows
Architecture: x86_64
CPUs: 4
Total Memory: 7.905GiB
Name: ServerName
Docker Root Dir: D:\docker-root
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

docker version

Client:
 Version:      17.10.0-ee-preview-3
 API version:  1.33
 Go version:   go1.8.4
 Git commit:   1649af8
 Built:        Fri Oct  6 17:52:28 2017
 OS/Arch:      windows/amd64

Server:
 Version:      17.10.0-ee-preview-3
 API version:  1.34 (minimum version 1.24)
 Go version:   go1.8.4
 Git commit:   b8571fd
 Built:        Fri Oct  6 18:01:48 2017
 OS/Arch:      windows/amd64
 Experimental: true
docker docker-compose rabbitmq docker-for-windows docker-desktop
2个回答
1
投票

在 AWS ECS 容器内运行 RabbitMQ 时,我遇到了同样的问题

免责声明:我没有详细检查此行为,这只是我的假设,所以问题原因可能是错误的,但至少解决方案是有效的

感觉就像 RabbitMQ 在容器启动时创建

.erlang.cookie
文件(如果它不存在)。如果容器内用户是
root
:

...
  rabbitmq:
    image: rabbitmq:3-management
    # set container user to root
    user: 0:0
...

然后将创建具有

.erlang.cookie
权限的
root
。但是 RabbitMQ 使用
rabbitmq
用户权限启动子进程。在这种情况下
.erlang.cookie
是不可写(可编辑)的。

为了避免这个问题,我使用

.erlang.cookie
:
 使用现有 
Dockerfile

文件创建了自定义图像
ARG COOKIE_VALUE=SomeDefaultRandomString01
FROM rabbitmq:3.11-alpine

ARG COOKIE_VALUE=$COOKIE_VALUE

RUN printf 'log.console = true\nlog.console.level = warning\nlog.default.level = warning\nlog.connection.level = warning\nlog.channel.level = warning\nlog.file.level = warning\n' > /etc/rabbitmq/conf.d/10-logs_to_stdout.conf && \
    printf 'loopback_users.guest = false\n' > /etc/rabbitmq/conf.d/20-allow_remote_guest_users.conf && \
    printf 'management_agent.disable_metrics_collector = true' > /etc/rabbitmq/conf.d/30-disable_metrics_data.conf && \
    chown rabbitmq:rabbitmq /etc/rabbitmq/conf.d/* && mkdir -p /var/lib/rabbitmq/ && \
    echo "$COOKIE_VALUE" > /var/lib/rabbitmq/.erlang.cookie && chmod 400 /var/lib/rabbitmq/.erlang.cookie && \
    chown -R rabbitmq:rabbitmq /var/lib/rabbitmq

其中

.erlang.cookie
值可以是任何随机字符串,但对于 RabbitMQ 集群中的所有节点应该相同(额外信息此处)。


0
投票

我使用以下命令直接在 RabbitMQ 容器内运行命令(

rabbitmq
官方
rabbitmq:4.0-management
图像
):

docker exec -i rabbitmq rabbitmqctl wait --pid 1 --timeout 60
docker exec -i rabbitmq rabbitmqctl status

鉴于它们出现错误,您可能需要确保也使用

root
(UID=0) 运行它们,这也是容器中的rabbitmq进程的运行方式。

因此,由于它在 root 上运行,因此您还需要以 root 身份运行它:

docker exec -i --user root rabbitmq rabbitmqctl wait --pid 1 --timeout 60
docker exec -i --user root rabbitmq rabbitmqctl status

这为我解决了这个问题,因为这显然是一个权限问题。

© www.soinside.com 2019 - 2024. All rights reserved.