从Jenkins Docker中运行主机Docker



是否可以在运行的Jenkins Docker Container中创建和运行CI/CD的Docker容器?因此,基本上是从一个正在运行的容器中访问主机服务器上的Docker。

在我的主机服务器(Ubuntu 19.04(上安装了Docker(Docker版本19.03.3(。通过运行以下命令,我创建了一个Jenkins Container,并授予Docker权限(所以我想(:

mkdir /home/myuser/Desktop/jenkins_home
docker run -dit --name jenkins -v /home/myuser/Desktop/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 jenkins/jenkins:lts

在Jenkins中,我创建了一个从Git加载Jenkinsfile的管道,如下所示:

pipeline {
agent {
docker {
image 'ubuntu:19.04'
args '-u root:sudo -p 3000:3000'
}
}
stages {
stage('Install') {
steps {
sh 'apt-get update'
sh 'apt-get install -y curl'
sh 'curl -sL https://deb.nodesource.com/setup_13.x | sh -'
sh 'curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -'
sh 'echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list'
sh 'apt-get update'
sh 'apt-get install -y nodejs yarn'
}
}
stage('Build') {
steps {
sh './build.sh'
}
}
}
}

当我运行Pipeline时,它在试图指示Docker提取ubuntu:19.04Docker映像时崩溃。错误为docker: not found

在某些地方,我的Jenkins容器和主机Docker访问文件之间的连接配置错误。从Docker容器中在主机服务器上运行Docker命令需要什么配置?

如果您想从Jenkins容器创建并运行CI/CD的Docker容器,这可以通过在Jenkins作业上创建一个shell命令来实现,该命令在Docker主机上运行ssh命令。

这需要Jenkins容器ssh公钥在Docker主机上授权,所以authorized_keys文件应该存在于Docker主机中。要在Jenkins容器中使用相同的ssh密钥,可以使用Jenkins容器上带有ssh密钥的绑定挂载。使用docker compose的示例:

volumes:
- /home/user/.ssh/id_rsa:/var/jenkins_home/.ssh/id_rsa 
- /home/user/.ssh/id_rsa.pub:/var/jenkins_home/.ssh/id_rsa.pub

这是一个shell命令的示例内容,用于从Jenkins作业启动和更新Docker主机上的容器:

cat ./target/stack/installer-*.tar | ssh root@${DOCKER_HOST} 
/home/user/Build-Server/remote-installer.sh

在上面的命令中,将在Docker主机上启动一个安装程序。因此,在Docker主机上部署/更新了新的容器。remote-installer.sh脚本从标准输入接收文件,并使用tar命令对其进行解压缩。

TEMPDIR=`mktemp -d`
echo "unarchiving to $TEMPDIR"
tar xv -C "$TEMPDIR"
...

这适用于Docker容器与Jenkins容器在同一服务器上,或者Docker容器和Jenkins容器位于不同服务器上的两种情况。

最新更新