Jenkins Pipeline执行位置疑惑:容器还是Jenkins主机?
你的Pipeline确实在Docker容器内执行,出现主机目录是因为Jenkins的工作区挂载机制
别担心,你的Pipeline确实是在node:10-alpine容器里运行的,那些看似矛盾的日志其实是Jenkins Docker Agent的默认行为导致的,我来给你拆解清楚:
1. 为什么能确定是在容器内执行?
你提到的两个证据已经非常明确:
cat /proc/1/cgroup的输出显示进程归属Docker容器的cgroup组,这是进程运行在容器内的核心标识;- 你在容器内创建了
/root/my_file,主机上找不到这个文件——容器的文件系统和主机是完全隔离的,容器内的/root目录和主机的/root没有任何关联。
2. 为什么会出现主机上的目录路径?
这是因为Jenkins的Docker Agent默认会把Jenkins主机上的Pipeline工作区目录,挂载到容器内的对应路径。这么做的目的是让容器能直接访问主机上的代码、构建产物,避免重复拉取文件,同时保持Pipeline的文件连贯性。
你看到的/home/jenkins/mount-dir/workspace/test-docker-pipeline/api/node_modules/libpq,其实是容器内的路径,但这个路径通过Docker卷挂载指向了主机上的同名目录。npm在安装依赖时会打印文件系统的实际路径,所以就出现了主机的目录路径,但执行npm install的进程本身还是在容器里的。
3. 怎么验证这个挂载行为?
你可以在Pipeline里加个步骤验证:
stage('Verify Mount') { steps { sh ''' # 查看容器内的工作区路径 pwd # 查看挂载情况,能看到主机目录挂载到容器的工作区 df -h | grep workspace ''' } }
执行后你会发现,容器内的工作区路径和主机上的工作区路径完全对应,且通过Docker卷挂载关联。
4. 如果不想让Jenkins挂载主机工作区怎么办?
如果你希望容器完全隔离,不共享主机工作区,可以修改Docker Agent的配置,指定workspaceVolume为emptyDir(容器内的临时空目录):
agent { docker { image 'node:10-alpine' args '-u root:root' workspaceVolume 'emptyDir' } }
这样npm install生成的node_modules就会完全存放在容器内,日志里也不会出现主机的目录路径了。
内容的提问来源于stack exchange,提问作者Ganesh Satpute
相关产品推荐
相关产品推荐

