我正试图让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
使用的 DockerfileFROM 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,但是他们问的是不同的
答案 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
,您就可以在那里安装,启动和重新启动所需的任何服务。