将RabbitMQ的策略设置为Dockerfile进程的一部分

我正在尝试使用定制的策略集来创build基于RabbitMQ存储库的Dockerfile。 问题是我不能使用CMDENTRYPOINT因为它会覆盖基本的Dockerfile,然后我必须拿出我自己的,我不想走这条路。 更不用说,如果我不使用RUN ,它将是运行时命令的一部分,我希望它被包含在图像中,而不仅仅是容器。

我能做的其他事情是使用RUN命令,但问题是RabbitMQ服务器没有在构build时运行,也没有--offline标志为rabbitmqctl程序的set_policy命令。

当我使用docker的RUN命令来设置策略时,这里是我面对的错误:

 Error: unable to connect to node rabbit@e06f5a03fe1f: nodedown DIAGNOSTICS =========== attempted to contact: [rabbit@e06f5a03fe1f] rabbit@e06f5a03fe1f: * connected to epmd (port 4369) on e06f5a03fe1f * epmd reports: node 'rabbit' not running at all no other nodes on e06f5a03fe1f * suggestion: start the node current node details: - node name: 'rabbitmq-cli-136@e06f5a03fe1f' - home dir: /var/lib/rabbitmq - cookie hash: /Rw7u05NmU/ZMNV+F856Fg== 

那么有没有什么办法可以在不写我自己版本的CMD和/或ENTRYPOINT情况下为RabbitMQ制定策略?

由于RabbitMQ的mnesia数据path基于容器的主机名,所以你的处境有点棘手。

 root@bf97c82990aa:/# ls -1 /var/lib/rabbitmq/mnesia rabbit@bf97c82990aa rabbit@bf97c82990aa-plugins-expand rabbit@bf97c82990aa.pid 

对于其他图像构build,您可以播种数据文件,或编写一个RUN调用的脚本来启动应用程序或数据库并对其进行configuration。 使用RabbitMQ,容器主机名将在图像构build和运行时间之间改变,所以图像的configuration将不会被拾取。

我觉得你一直在做容器创buildconfiguration或启动时。

选项

在启动后创build包装CMD脚本来执行策略有点复杂,因为/usr/lib/rabbitmq/bin/rabbitmq-server在前台运行rabbit,这意味着您无法访问“启动后”点。 Docker并没有真正做后台进程,所以rabbitmq-server -detached没有多大的帮助。

如果你要使用Ansible,Chef或Puppet来设置容器。 为容器启动configuration一个固定的主机名。 然后启动它并将策略configuration为下一步。 这只需要做一次,只要主机名是固定的,而且你没有使用--rm标志 。

在运行时,systemd可以使用ExecStartPost将configuration完成到一个服务。 我相信大多数服务经理将具有相同的function。 我想你最终可能会丢失消息,或者至less在每次启动时都会导致错误,如果在configuration完成之前有任何事情发生的话。