【问题标题】:Build image with docker file error: Failed to get D-Bus connection: Operation not permitted使用 docker 文件错误构建映像:无法获得 D-Bus 连接:不允许操作
【发布时间】:2020-03-13 14:51:55
【问题描述】:

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

systemctl start postgresql-9.6.service
systemctl disable NetworkManager

当我执行docker build 时,出现错误:

获取 D-Bus 连接失败:不允许操作

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

有什么想法吗?

【问题讨论】:

  • 嗨 zysaaa,你想达到什么目的?仅在极少数情况下,建议通过 docker 内部的 systemctl 启动服务。请提供有关您的用例的更多信息
  • 感谢您的评论,我对docker很陌生。我想在我的dockerfile中设置运行项目所需的环境,例如数据库的一些配置,启用sshd服务等在docker build 之后,我得到的图像将拥有我需要的一切。这些操作不应该在dockerfile中进行吗?@ClemensKaserer
  • 嗨here_2_learn,好点,但我不认为这是重复的。这里的问题似乎更多源于尝试像使用 VM 一样使用容器。
  • @zysaaa 如果任何答案解决了您的问题,请接受适当的答案以与社区分享解决方案。如果没有,请提供更多信息

标签: docker dockerfile docker-build


【解决方案1】:

将对话从 cmets 转移到答案:

Clemens:你好 zysaaa,你想达到什么目标?仅在极少数情况下,建议通过 docker 内部的 systemctl 启动服务。请提供有关您的用例的更多信息

zysaaa:感谢您的评论,我对docker很陌生。我想在我的dockerfile中设置运行项目所需的环境,例如数据库的一些配置,启用sshd 服务等等,在 docker build 之后,我得到的镜像就会有我需要的一切。这些操作不应该在dockerfile中进行吗?@ClemensKaserer

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


这里是 dockerhub 上 postgres 镜像的链接

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

如果您有任何想要解释的内容,请对答案发表评论,我将在答案中进行扩展。

【讨论】:

    【解决方案2】:

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

    docker-systemctl-replacement script 可以用来避免这种情况。 docker-systemctl-images examples 确实已经包含一个 postgres 变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2014-10-27
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      相关资源
      最近更新 更多