Docker CentOS7镜像部署Ambari2.6时D-Bus连接错误求助
解决Docker CentOS7镜像中Ambari初始化PostgreSQL时D-Bus权限错误的方案
我之前在CentOS7容器里部署Ambari时也碰到过一模一样的问题——只要运行systemd管理的服务就会弹出Failed to get D-Bus connection: Operation not permitted,折腾了好一阵才找到靠谱的解决办法,本质原因是Docker默认容器没有初始化systemd运行环境,而CentOS7的绝大多数服务(包括Ambari依赖的PostgreSQL)都依赖systemd和D-Bus组件。
下面是几个亲测有效的解决思路,按优先级排序:
1. 启动容器时初始化systemd环境(最推荐)
默认Docker容器用的是普通PID1进程(比如bash),没法支撑systemd运行,我们需要让容器以systemd作为PID1,同时挂载必要的系统目录并赋予足够权限:
docker run -d -it --privileged=true -v /sys/fs/cgroup:/sys/fs/cgroup:ro centos:7 /usr/sbin/init
--privileged=true:让容器获得主机级别的权限,解决systemd需要的权限限制-v /sys/fs/cgroup:/sys/fs/cgroup:ro:挂载cgroup文件系统,这是systemd管理进程的核心依赖/usr/sbin/init:指定容器启动时运行systemd的init进程作为PID1
启动容器后,你再进入容器安装Ambari、初始化PostgreSQL,用systemctl命令管理服务就不会再碰到D-Bus的错误了。
2. 非特权模式下手动配置D-Bus和cgroup
如果不想用特权容器,可以通过挂载cgroup并手动启动D-Bus来解决:
- 首先用以下命令启动容器:
docker run -d -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro --cgroupns=host centos:7
- 进入容器后安装D-Bus组件:
yum install -y dbus
- 手动启动D-Bus服务:
systemctl start dbus
完成这些步骤后,再去执行Ambari的数据库初始化或者启动相关服务,D-Bus的连接问题应该就能解决了。
3. 绕过systemd直接启动服务(备选方案)
如果上述两种方法都不符合你的场景,可以尝试不依赖systemd来运行PostgreSQL和Ambari:
- 对于PostgreSQL,安装完成后直接用初始化脚本启动:
postgresql-setup initdb /usr/bin/postgres -D /var/lib/pgsql/data &
- 对于Ambari,可以找到它的启动脚本(通常在
/usr/sbin/目录下)直接运行,而不是通过systemctl start ambari-server
不过这个方法需要手动处理服务的后台运行、日志管理等问题,只推荐在特殊场景下使用。
内容的提问来源于stack exchange,提问作者fadhloun anis
相关产品推荐
相关产品推荐

