我正在寻找一种在Jenkins 2.0中运行由多个容器组成的支持Docker的构建的方法。
是否有计划在 Pipeline 中为 Docker Compose 提供原生支持,或通过CloudBees docker插件为管道提供支持。
或者可以/必须通过显式调用sh docker-compose...
解决这个问题吗?甚至可以在try... finally
内使用它们
进一步控制服务生命周期。
答案 0 :(得分:12)
在Jenkins bug tracking中搜索后,使用JENKINS-35025在Docker容器中运行作业时,会考虑maven build建议docker-compose.yml
。
另请参阅Creating CI pipeline with Jenkins,它假设您的Jenkins服务器上安装了docker-compose。
注意:一年后(2017年8月),docker-compose is still not supported in the Docker Pipeline plugin
2018年7月,Ivan Aracki注意in the comments:
使用与主机版本相同的版本手动安装
docker-cli
和docker-compose
是现在的解决方案......
答案 1 :(得分:2)
以下是运行在其中运行docker的jenkins容器的文件:
docker run \
-p 8080:8080 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
getintodevops/jenkins-withdocker:lts
参考:https://getintodevops.com/blog/the-simple-way-to-run-docker-in-docker-for-ci
答案 2 :(得分:0)
我遇到了类似的问题,我发现了https://reinout.vanrees.org/weblog/2017/10/03/docker-compose-in-jenkins.html,但我不知道与此有什么关系。
我的问题是在开发时测试,并且还在Jenkins中自动化测试,我使用docker-compose来调出一些php脚本和一个mysql服务器,运行隔离测试(截至目前的phpunit)。
我认为我可以通过
实现这一目标docker network create
)docker run mysql --network=netname --name=mysqlmachine
mysqlmachine
作为主机。但是这意味着我需要设置db数据,清理db数据,并且即使在不需要时也总是留在mysqlmachine上,消耗一些ram资源。我可以在定义管道的Jenkinsfile中用docker start mysqlmachine
和docker stop mysqlmachine
命令解决最后一个问题。
但是,再一次,在jenkins运行的docker中执行shell我找不到docker
命令
对我而言,这是一个可行的解决方案,直到我找不到更好的东西
更新: 我将尝试https://wiki.jenkins.io/display/JENKINS/Docker+Slaves+Plugin解决方案,它几乎满足我的需求
更新08.02: 正如Alexander Zeitler所建议的,使用
agent {
docker {
image 'pdmlab/jenkins-node-docker-agent:6.11.1'
args '-v /var/run/docker.sock:/var/run/docker.sock'
}
}
在Jenkins文件中的允许在docker中使用docker-compose命令:docker,这主要是docker附近的docker,如下所示:Docker in Docker - volumes not working: Full of files in 1st level container, empty in 2nd tier
但我更喜欢使用另一种方法,不需要以特殊方式运行jenkins。
管道说:
stage('Test') {
steps {
sh './build_docker.sh jenkinstests'
}
}
和build_docker.sh确实:
jenkinstests)
docker volume create idealodbconn
docker run -v idealodbconn:/data --name helper busybox true
docker cp ./dbconn/db249.json helper:/data
docker rm helper
docker-compose -f services/docker-compose-jenkins.yml up \
--abort-on-container-exit \
--exit-code-from idealoifapi
docker-compose -f services/docker-compose-jenkins.yml rm -f
docker volume rm idealodbconn
;;
此处--abort-on-container-exit
表示退出,一旦定义到docker-compose-jenkins.yml中的一个容器退出,--exit-code-from idealoifapi
表示从idealoifapi图像中取出退出代码。
就是这样。可能缺少的部分是docker-compose-jenkins.yml使用的卷,它是外部的:true:
volumes:
idealodbconn:
external: true
答案 3 :(得分:0)
我按照他们的Nestybox中的描述,docker-compose
使用blog post在Jenkins管道中工作。我使用以下Dockerfile构建了自己的Jenkins安装:
FROM nestybox/jenkins-syscont:latest
# Install docker-compose
RUN curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose \
&& chmod +x /usr/local/bin/docker-compose
因此,我只是按照blog post中的说明进行操作,并且可以运行如下所示的管道:
pipeline {
agent any
stages {
stage('docker-compose') {
steps {
sh "docker-compose build"
sh "docker-compose up -d"
...
}
}
}
post {
always {
sh "docker-compose down || true"
}
}
}