使用docker文件错误构建映像:无法获得D-Bus连接:不允许操作

时间:2019-11-18 09:08:34

标签: docker dockerfile docker-build

我正在用startKoin { printLogger() modules(applicationModule, repositoryModule) } 构建image,在我的docker文件中,我执行了一个脚本。在脚本中,有一些命令,例如:

docker file

当我执行systemctl start postgresql-9.6.service systemctl disable NetworkManager 时,它会出错:

  

无法建立D-Bus连接:不允许操作

基于docker build的图片。 我尝试使用支持systemd(solita/centos-systemd )的基本centos映像,但是它不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

将会话从评论移至答案:

克莱门斯:您好,zysaaa,您想要实现什么?仅在极少数情况下,建议通过docker内部的systemctl启动服务。请提供有关您的用例的其他信息

zysaaa :感谢您的评论,我是Docker的新手。我想在dockerfile中设置运行项目所需的环境,例如数据库的某些配置,启用sshd服务等等,在docker构建之后,我得到的映像将具有我需要的一切。这些操作不应该在dockerfile中执行吗?@ClemensKaserer

克莱门斯:不,^^。码头工人映像应具有单一用途,例如运行您的postgres数据库。这意味着在您的容器中,您只想运行该单个进程(postgres),而无需执行其他任何操作。因此,没有整个操作系统及其所有子进程。这是使容器技术如此强大的一个方面。您不需要运行整个操作系统,只需运行所需的过程即可。特别是对于postgres,我建议您使用官方图像然后从那里去。通过查看与映像相关联的Dockerfile,您将学到很多有关如何使用容器的知识;)


这是dockerhub上postgres映像的链接

以及带有标签的图像的相关dockerfile:最新

如果您有任何想要解释的内容,只需评论一下答案,我会在答案中进行扩展。

答案 1 :(得分:0)

在Centos7上,所有服务都是通过systemd守护程序启动和停止的。 systemctl命令将仅尝试使用d-bus通道与守护程序对话-这就是消息的来源。仅仅是因为容器中没有systemd。

docker-systemctl-replacement script可用于避免这种情况。并且docker-systemctl-images examples已经包含一个postgres变体。