如何在openshift / jenkins-1-centos7docker集装箱中启用系统服务?

我有一个情况,我需要在这个jenkins容器中启动一些服务,使其在我们的项目中工作。 所以我需要Systemd启用为了做到这一点…

截至目前,当我尝试在此容器中运行“systemctl”命令时,出现以下错误:

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

这是预期的。 现在在我的研究中,我发现如果我们使用下面的docker文件来创build一个映像,然后运行一个容器,我们应该可以运行systemctl命令:

FROM docker.io/openshift/jenkins-1-centos7 MAINTAINER "you" your@email.here 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/*; VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"] 

我得到了下面的错误

 /bin/sh: line 0: [: cryptsetup.target: unary operator expected rm: cannot remove 'cryptsetup.target': Permission denied /bin/sh: line 0: [: dev-hugepages.mount: unary operator expected rm: cannot remove 'dev-hugepages.mount': Permission denied /bin/sh: line 0: [: dev-mqueue.mount: unary operator expected rm: cannot remove 'dev-mqueue.mount': Permission denied ... 

我正在使用root用户来运行该命令。

虽然,如果我将源图像replace为正常的centos图像

FROM centos:7

这个新创build的图像(基于centos)systemd工作正常。

是否有这个错误的原因? 或者我不能在给定的jenkins-1-centos7图像上创build一个systemdtypes的图像?

编辑:好吧,所以一个专家帮助我了解,“默认情况下,在Dockerfile中,你以root用户身份运行命令,直到你用USER指令改变用户,但是由于你正在build立一个已经改变了的图像,我相信你作为Jenkins用户而不是root用户运行命令,如果你明确地切换回root,那么你可以运行这些命令。

所以新文件看起来像这样:

 FROM docker.io/openshift/jenkins-1-centos7 MAINTAINER "you" your@email.here #ENV container docker USER root RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in ; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -rf /lib/systemd/system/multi-user.target.wants/;\ rm -rf /etc/systemd/system/.wants/;\ rm -rf /lib/systemd/system/local-fs.target.wants/; \ rm -rf /lib/systemd/system/sockets.target.wants/udev; \ rm -rf /lib/systemd/system/sockets.target.wants/initctl; \ rm -rf /lib/systemd/system/basic.target.wants/;\ rm -rf /lib/systemd/system/anaconda.target.wants/*; VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"] 

有用!! 但是现在,jenkins服务并没有开始给出下面的错误:bash-4.2#systemctl status jenkins.service●jenkins.service – LSB:Jenkins持续集成服务器加载:加载(/etc/rc.d/init.d / jenkins)激活:失败(结果:退出代码)自Tue 2016-10-18 19:45:17 UTC; 5s前文件:man:systemd-sysv-generator(8)进程:95 ExecStart = /etc/rc.d/init.d/jenkins start(code = exited,status = 1 / FAILURE)

 Oct 18 19:45:17 578908315d82 systemd[1]: Starting LSB: Jenkins Continuous Integration Server... Oct 18 19:45:17 578908315d82 jenkins[95]: /etc/rc.d/init.d/jenkins: line 51: /etc/init.d/functions: No such file or directory Oct 18 19:45:17 578908315d82 systemd[1]: jenkins.service: control process exited, code=exited status=1 Oct 18 19:45:17 578908315d82 systemd[1]: Failed to start LSB: Jenkins Continuous Integration Server. Oct 18 19:45:17 578908315d82 systemd[1]: Unit jenkins.service entered failed state. Oct 18 19:45:17 578908315d82 systemd[1]: jenkins.service failed. 

目前还在研究这个…

编辑2:所以我解决了这个问题,因为我决定使用一个单独的容器来运行一切,这个jenkins容器是原封不动的,因为它是…

除了在openshift/jenkins上的问题, openshift/jenkins 问题7459指出:

它适用于这个PR#25567 ,只需要--cap-add SYS_ADMIN

这个提交还没有在Docker中发布。