在Dockerfile中启动Gunicorn服务:无法获得D-Bus连接:不允许操作

我试图用我的dockerfile启动服务(gunicorn,nginx),但我得到了这个错误。

这是我的dockerfile

FROM centos:centos7 RUN yum -y install epel-release RUN yum -y --enablerepo=base clean metadata RUN yum -y install nginx RUN yum -y install python-pip RUN pip install --upgrade pip RUN yum -y install systemd; RUN yum clean all; COPY . / RUN pip install --no-cache-dir -r requirements.txt RUN ./manage.py makemigrations RUN ./manage.py migrate ENV container docker RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \ systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*;\ rm -f /etc/systemd/system/*.wants/*;\ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; #Gunicorn RUN cp gunicorn_systemd /etc/systemd/system/gunicorn.service RUN systemctl start gunicorn RUN systemctl enable gunicorn 

这是我的build立命令

dockerbuild设-t guni ./

请帮忙吗?

您正在尝试与构build脚本中的systemd进行交互:

 RUN systemctl start gunicorn 

这里有一些问题。 首先,试图在构build过程中“启动”服务没有任何意义:您正在构build映像,而不是启动容器。

其次,你正试图与systemd交互,但是你永远不会启动systemd ,而且你也不太可能[1]。 由于Docker容器通常是一个“单一进程”环境,因此您不需要任何类似init的进程pipe理器来为您启动任何操作。 你只需要安排自己运行必要的命令。

以Apache httpd为例,而不是运行:

 systemctl start httpd 

你会运行:

 httpd -DFOREGROUND 

这将运行Web服务器并确保它保持在前台(当前台进程退出时,Docker容器将退出)。 你当然可以做一些类似gunicorn。

你的容器也缺less一个CMDENTRYPOINT指令,所以当你运行它时,除非你提供一个明确的命令,否则它不会做任何事情,这可能不是你想要的行为。

[1]如果你真的认为你需要systemd,你需要安排在容器启动的时候启动它(例如, CMD /sbin/init ),但是systemd在没有特权的容器环境中运行得并不顺利。 这是可能的,但我不会推荐它。