无法在正在詹金斯内部运行的docker内部运行systemd

时间:2019-02-01 04:26:49

标签: docker jenkins systemd

我正试图让Jenkins运行运行SystemD的Docker

到目前为止我已经能够在没有Jenkins的情况下在docker内部本地运行systemd 。以下是在没有詹金斯的情况下在本地运行它的步骤:

# pull unop/fedora-systemd and create and run the container for it
sudo docker run --cap-add=SYS_ADMIN -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -t -i unop/fedora-systemd

# on a different terminal window, I can:
# get the container id of the "unop/fedora-systemd" image
sudo docker ps

# then exec bash on it
sudo docker container exec -t -i a98aa2bcd19e bash # where a98aa2bcd19e is the container id found above

# once inside the container, I can run systemd without any problems. examples:
systemctl status
systemctl start dbus.service
systemctl status dbus.service

以上内容在本地工作,我能够在docker容器中运行systemd。 我遇到的问题是,当我尝试同样的事情时,却在詹金斯内。

我已经尝试过几次调整Jenkinsfile,但是以前的尝试似乎没有效果。在詹金斯(Jenkins)下运行时,总是会出现错误

+ systemctl status
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

这是我尝试过的最新 Jenkinsfile

pipeline {
    agent {
        docker {
            image 'unop/fedora-systemd'
            args '--cap-add=SYS_ADMIN -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:ro -t -i'
        }
    }

    stages {
        stage('test') {
            steps {
                sh "echo hello world"
                sh "systemctl status"
                sh "systemctl start dbus.service"
                sh "systemctl dbus.service"
            }
        }
    }
}

在以前的Jenkinsfile迭代中,我尝试将-cap-add=SYS_ADMIN -e container=docker替换为--privileged,但这无济于事,我仍然遇到相同的错误

任何人都知道如何使它工作?为什么上述方法在本地有效,但在Jenkins上无效?我在这里想念什么?

注意:Jenkins版本:2.150.2,这是 unop / fedora-systemd

使用的 Dockerfile
FROM fedora:rawhide
MAINTAINER http://fedoraproject.org/wiki/Cloud

ENV container docker

RUN dnf -y update && dnf clean all

RUN dnf -y install systemd && dnf clean all && \
(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", "/tmp", "/run" ]
CMD ["/usr/sbin/init"]

PS:我见过related question,但是他们问的是不同的

2 个答案:

答案 0 :(得分:0)

我不知道相关的问题。让我再次指出,你不需要运行systemd守护在systemd受控集装箱,如果它只是在它运行多种服务。只需使用docker-systemctl-replacement脚本覆盖/usr/bin/systemctl。然后将其注册到CMD ["/usr/bin/systemctl"]作为容器的初始化过程。

就是这样。现在,您可以从操作系统运行任何systemctl-start进程。在某种程度上,即使使用ansible / puppet脚本进行配置也完全没有问题。具体地说,我正在使用它为Jenkins映像提供开发人员喜欢作为基础的操作系统。无需特权模式。

答案 1 :(得分:0)

您可以使用以下命令尝试使用具有系统D的Fedora的映像:

docker run -d --name systemd-fedora --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro jrei/systemd-fedora

然后您只需要运行:

docker exec -it systemd-fedora /bin/bash

,您就可以在那里安装,启动和重新启动所需的任何服务。