[英]Is Jenkins running command inside container?
我想在 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? 如果是其中一種情況,為什么我會看到矛盾的日志語句?
您的所有命令都按照您的預期在容器內運行。 所以一切都很好。
Jenkins 正在做的是在容器內的相同位置綁定掛載 Workspace 文件夾。 如果您檢查您的作業控制台輸出,您應該會發現如下內容:
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
選項將您的工作區文件夾從主機綁定安裝到正在運行的容器內的相同位置。 有關 Docker 的 bind-mlunt 功能的更多信息,請參閱官方文檔: https ://docs.docker.com/storage/bind-mounts/
編輯:由於 Pipeline 2.5 Jenkins Pipeline 原生支持 Docker 鏡像。 因此不再需要 Docker 管道插件。
仔細查看管道作業的日志后,我看到了這一行
$ 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 主機上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.