我在 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
在 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 集群中的所有节点应该相同(额外信息此处)。
我使用以下命令直接在 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
这为我解决了这个问题,因为这显然是一个权限问题。