使用docker文件错误生成映像:无法获取D-Bus连接:不允许执行操作



我正在用docker file构建image,在我的docker文件中我执行一个脚本。在脚本中,有一些命令,如:

systemctl start postgresql-9.6.service
systemctl disable NetworkManager

当我执行docker build时,它会出错:

无法获得D-Bus连接:不允许操作

基于centos的图像。我尝试使用支持systemd的基本centos图像(solita/centrossystemd),但没有起作用。

有什么想法吗?

将对话从注释转移到答案:

Clemens:嗨,zysaaa,你想实现什么?只有在极少数情况下,建议通过docker内部的systemctl启动服务。请提供有关您的用例的其他信息

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

克莱门斯:不。docker镜像应该有一个单一的用途,例如运行postgres数据库。这意味着在您的容器中,您只想运行单个进程(postgres(,而不想运行其他进程。因此,没有整个操作系统及其所有子流程。这是容器技术如此强大的一个方面。您不需要运行整个操作系统,只需要运行所需的进程即可。特别是对于postgres,我建议您使用官方图片并从那里开始。通过查看与图像相关的Dockerfile,您已经了解了很多关于如何使用容器的信息;(


这里是dockerhub 上postgres图像的链接

  • https://hub.docker.com/_/postgres

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

  • https://github.com/docker-library/postgres/blob/a8613f4cda3e932245f09c4d0f6733462b14b582/12/Dockerfile

如果你有什么想解释的,只要对答案发表评论,我会在答案中扩展它。

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

dockersystemctl替换脚本可以用来避免这种情况。docker systemctl镜像示例已经包含了postgres变体。

相关内容

  • 没有找到相关文章