背景:
我关注在 Docker 中下载并运行 Jenkins设置Jenkins
服务器。使用以下参数来运行Docker
。
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
构建正在成功运行,但是,当进入阶段时,需要Integration Test
一个数据库。 计划是MySQL
使用多个容器,而我的Jenkinsfile
如下:
pipeline {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2'
}
}
stages {
stage('Build') {
when {
changeRequest()
}
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
agent {
docker {
image 'mysql/mysql-server'
args '--name some-mysql -e MYSQL_ROOT_PASSWORD=password -d'}
}
steps {
sh 'mvn test -DforkCount=0'
sh '''
docker exec some-mysql sh -c 'exec mysql < ./db/dump.sql
'''
}
post {
always {
junit 'target/surefire-reports/*.xml'
}
}
}
}
}
与子目录位于./db/dump.sql
同一个 git 存储库中。Jenkinsfile
db
问题:
[workspace@2] Running shell script
+ docker inspect -f . mysql/mysql-server /var/jenkins_home/jobs/myproject/branches/master/workspace@2@tmp/durable-77d559d6/script.sh: line 1: docker: not found
[Pipeline] sh
[workspace@2] Running shell script
+ docker pull mysql/mysql-server /var/jenkins_home/jobs/myproject/branches/master/workspace@2@tmp/durable-21da0ff2/script.sh: ... line 1: docker: not found
ERROR: script returned exit code 127
Finished: FAILURE
因为以 root 身份运行,所以权限应该不是问题,对吗?
使用 Docker 和管道提供了几种解决方案,其他解决方案是否会更容易设置环境Integration Test
?
答案1
控制台输出描述了错误:
line 1: docker: not found
shell 脚本找不到 docker,可能是因为您的 Jenkins 执行器上未安装 Docker。(Jenkins Docker 插件不能保证 Docker 可用于 Jenkins 外部进程,例如 shell 脚本。)
答案2
容器上未安装 Docker 客户端。请安装 docker 或使用 jenkins + docker 的镜像。此外,还使用了主机的 docker 守护进程,需要将其挂载。
以下命令应该有帮助:
docker volume create jenkins-master-data
docker run --name jenkins-master -u 0 --privileged -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v jenkins-master-data:/var/jenkins_home gustavoapolinario/jenkins-docker