我想在Docker容器中运行Jenkins管道,例如运行所有测试,进行声纳扫描等。
这就是我的管道的样子。
pipeline {
agent {
docker {
image 'node:10-alpine'
args '-u root:root'
}
}
stages {
stage('Checkout') {
steps {
sh 'node --version; cat /proc/1/cgroup; touch /root/my_file'
checkout(...)
}
}
stage('Run Unit Tests') {
steps {
sh '''
npm install --unsafe-perm
'''
}
}
}
}
现在作为输出,我在控制台中看到以下日志
+ cat /proc/1/cgroup
...
2:freezer:/docker/eeea802143ce0f1b4047650956e58624a0c38a5fbc601f189755a381dcf9c271
1:name=systemd:/docker/eeea802143ce0f1b4047650956e58624a0c38a5fbc601f189755a381dcf9c271
这意味着命令在docker容器中运行。此外,我可以看到/root/my_file
在主机上不存在。
现在,进一步,我看到以下输出
+ npm install --unsafe-perm
> libpq@1.8.8 install /home/jenkins/mount-dir/workspace/test-docker-pipeline/api/node_modules/libpq
> node-gyp rebuild
现在,在这里我看到日志提到了主机上存在的目录。
我现在很困惑,我的管道在容器或内部Jenkins中执行的位置?如果有任何一种情况,为什么我看到矛盾的日志语句?
答案 0 :(得分:1)
您所有的命令都按预期在容器内运行。所以一切都很好。
Jenkins所做的是将Workspace文件夹绑定安装在Container内的同一位置。如果您检查Jobs Console输出,应该会找到类似的内容
Docker 1 does not seem to be running inside a container
$ docker run -t -d -u 1002:1002 -w /home/jenkins/build/workspace/<my-project> -v /home/jenkins/build/workspace/<my-project>:/home/jenkins/build/workspace/<my-project>:rw,z -v /home/jenkins/build/workspace/<my-project>@tmp:/home/jenkins/build/workspace/<my-project>@tmp:rw,z $ docker top 8948be0b380b033f20cd8c27647b88719b47a237f839513ebf66a9693b4c2975 -eo pid,comm
Running in /home/jenkins/build/workspace/<my-project>
-v
选项会将主机上的Workspace文件夹绑定安装到正在运行的容器内的同一位置。有关Docker的bind-mlunt功能的更多信息,请参见以下官方文档:https://docs.docker.com/storage/bind-mounts/
编辑:自Pipeline 2.5起,Jenkins Pipeline具有对Docker映像的本机支持。因此,不再需要Docker Pipeline插件。
答案 1 :(得分:0)
仔细查看管道作业的日志后,我看到了这条线
$ docker run -t -d -u 1001:1001 -u root:root -w /home/jenkins/mount-dir/workspace/test-docker-pipeline -v /home/jenkins/mount-dir/workspace/test-docker-pipeline:/home/jenkins/mount-dir/workspace/test-docker-pipeline:rw,z -v /home/jenkins/mount-dir/workspace/test-docker-pipeline@tmp:/home/jenkins/mount-dir/workspace/test-docker-pipeline@tmp:rw,
这是詹金斯(Jenkins)使用的docker run
命令。 Jenkins在这里将目录挂载在完全相同的路径中。因此,当我们在日志中看到引用/home/jenkins/mount-dir/...
时,它确实在Docker容器中运行,但实际的存储已安装在Jenkins主机上。