2017-08-04 1 views
0

Je tente de démarrer des services (gunicorn, nginx) avec mon dockerfile, mais j'ai reçu cette erreur.Démarrage du service Gunicorn dans Dockerfile: échec de la connexion D-Bus: opération non autorisée

Ceci est mon 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 

Et voici ma version commande

build docker -t GUNI ./

Toute aide s'il vous plaît?

Répondre

0

Vous essayez d'interagir avec systemd dans votre script de construction:

RUN systemctl start gunicorn 

Il y a un certain nombre de problèmes ici. Tout d'abord, essayer de "démarrer" un service dans le cadre du processus de construction n'a aucun sens: vous construisez une image, pas un conteneur.

Deuxièmement, vous essayez d'interagir avec systemd, mais vous ne commencez jamais systemd, et il est peu probable que vous vouliez [1]. Étant donné qu'un conteneur docker est généralement un environnement de "processus unique", vous n'avez besoin d'aucun superviseur de processus de type init pour démarrer des opérations pour vous. Vous avez juste besoin d'organiser vous-même la commande nécessaire.

Prendre Apache httpd comme un exemple, plutôt que de courir:

systemctl start httpd 

Vous courraient:

httpd -DFOREGROUND 

Ce court le serveur Web et assure qu'il reste au premier plan (le contenant Docker sera quitter lorsque le processus de premier plan se termine). Vous pouvez sûrement faire quelque chose de similaire avec gunicorn.

Votre conteneur ne dispose pas non plus d'une directive CMD ou ENTRYPOINT, donc il ne va rien faire lorsque vous l'exécutez, sauf si vous fournissez une commande explicite, et ce n'est probablement pas le comportement que vous souhaitez.

[1] Si vous vraiment que vous avez besoin systemd, vous devez prendre des dispositions pour démarrer au démarrage de conteneurs (par exemple, CMD /sbin/init), mais systemd est pas quelque chose qui fonctionne bien dans un environnement de conteneurs non privilégié. C'est possible mais je ne le recommanderais pas.