是否可以在运行的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.04
Docker映像时崩溃。错误为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容器位于不同服务器上的两种情况。