Jenkins是否在容器内运行命令?

时间:2020-03-30 10:34:51

标签: docker jenkins jenkins-pipeline

我想在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中执行的位置?如果有任何一种情况,为什么我看到矛盾的日志语句?

2 个答案:

答案 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主机上。