You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:47:40