【问题标题】:How to Enable Systemd service in openshift/jenkins-1-centos7 docker container?如何在 openshift/jenkins-1-centos7 docker 容器中启用 Systemd 服务?
【发布时间】:2016-10-14 23:43:15
【问题描述】:

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

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

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

这是预期的。 现在在我的研究中,我发现如果我们使用下面的 docker 文件创建一个镜像然后运行一个容器,我们应该能够运行 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用户运行命令。

不过,如果我将源图像替换为普通的 centos 图像

来自 centos:7

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

这个错误有什么原因吗?或者我不能在给定的 jenkins-1-centos7 图像之上创建一个 systemd 类型的图像?

编辑: 好的,所以一位专家帮助我理解了“默认情况下,在 Dockerfile 中,您以 root 身份运行命令,直到您使用 USER 指令明确更改用户。但是,由于您正在构建我相信您是以 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) 活动:自 2016 年 10 月 18 日星期二 19:45:17 UTC 以来失败(结果:退出代码); 5 秒前 文档: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.

目前仍在研究这个...

EDIT2: 所以我在某个时候解决了这个问题,因为我决定使用一个单独的容器来运行其他所有东西,而这个 jenkins 容器保持原样......

【问题讨论】:

    标签: docker dockerfile openshift-origin


    【解决方案1】:

    除了你的issue on openshift/jenkins,你还有docker issue 7459指出:

    这个PR #25567 对我有用,只有--cap-add SYS_ADMIN

    This commit 尚未在 docker 中发布。

    【讨论】:

    • 感谢您的输入,但 openshift origin 目前支持 docker 1.10 版。所以很明显我不能使用这个 PR。
    • 解决 docker 问题 7459 的方法是在 docker 文件中使用给定步骤创建一个新图像,我的问题是为什么我不能使用相同的步骤来创建类似于 jenkins-1 的图像-centos7 启用 systemd 的映像...
    • @AkshayaKhare 我明白了。 docker 1.10 可能不支持。
    【解决方案2】:

    让我再次指出,如果只是在其中运行多个服务,则不需要在 systemd 控制的容器中运行 systemd 守护程序。只需使用 docker-systemctl-replacement 脚本覆盖 /usr/bin/systemctl。然后去注册CMD ["/usr/bin/systemctl"]作为容器的init进程。

    就是这样。现在您可以从操作系统运行任何 systemctl-start 进程。它的工作原理是,即使使用 ansible/puppet 脚本进行配置也完全没有问题。具体来说,我使用它来为 Jenkins 映像提供开发人员喜欢作为基础的操作系统。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2018-10-09
      • 2019-10-25
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多