【问题标题】:Running commands inside docker container created using Dockerfile in Jenkinsfile在 Jenkinsfile 中使用 Dockerfile 创建的 docker 容器内运行命令
【发布时间】:2019-04-03 02:43:07
【问题描述】:
我创建了一个 Jenkins 管道文件并创建了一个 Jenkinsfile。在 Jenkinsfile 中,我使用了 Dockerfile 代理,然后运行了一些步骤。这些步骤应该在 docker 内部运行,但它们在主机上运行。
她的代码。
#!/usr/bin/env groovy
@Library(['abc-jenkins','xyz-jenkins-library']) _
pipeline {
agent {
dockerfile{
dir 'TEST'
filename 'dockerfile'
label 'docker'
}
}
stages {
stage('Build Stage') {
steps {
echo 'testing stage running'
sh "ls"
}
}
}
}
【问题讨论】:
标签:
docker
jenkins
jenkins-pipeline
【解决方案1】:
你根据ls的输出误会了。
对于 Jenkins 管道 docker DSL,它将 jenkins 作业工作区挂载到 docker 容器,并将 docker WORKDIR 更改为 jenkins 作业工作区。
因此,当您在容器内执行ls 时,它将打印您的詹金斯作业工作区下的文件和文件夹。
您可以尝试其他 cmd 或 ls 其他在主机中不存在的文件夹,以确认它确实在容器内而不是主机内执行。
【解决方案2】:
你可以使用 -> docker.image('image').inside{..}
stage('BuildInside') {
docker.image('ubuntu1804').withRun('-d=true -p 8888:8080') {c ->
docker.image('ubuntu1804').inside{
/* Do something here inside container */
sh "ls"
}
}
}
【解决方案3】:
您必须在阶段括号内编写代理创建阶段:
stages {
stage('Build Stage') {
agent {
dockerfile{
dir 'TEST'
filename 'dockerfile'
label 'docker'
}
steps {
echo 'testing stage running'
sh "ls"
}
}