docker - 在 Jenkins Pipeline 中访问本地运行的容器
问题描述
我正在尝试使用 Docker 来运行 Jenkins 和 Sonarqube。然后在 Jenkins 中,我想使用管道设置一个作业来构建和测试应用程序,然后使用 sonarscan 运行扫描。
我的问题似乎与网络有关,因为在 Jenkins 管道中,我无法通过 dns 名称访问 SonarQube 容器 IP。当我手动找到该容器的内部 IP 并将其放入 Jenkinsfile 时,我没有任何问题。
这是我用来启动所有容器的 docker 命令(由于 WSL 问题,我没有移至 docker-compose)。
docker network create jenkins
docker run --name jenkins-docker --rm --detach \
--privileged --network jenkins --network-alias docker \
--env DOCKER_TLS_CERTDIR=/certs \
--volume jenkins-docker-certs:/certs/client \
--volume jenkins-data:/var/jenkins_home \
--publish 3000:3000 \
--publish 2376:2376 docker:dind
docker build -t myjenkins-blueocean:1.1 .
docker run --name jenkins-blueocean --rm --detach \
--network jenkins --env DOCKER_HOST=tcp://docker:2376 \
--env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 \
--publish 8080:8080 --publish 50000:50000 \
--volume jenkins-data:/var/jenkins_home \
--volume jenkins-docker-certs:/certs/client:ro \
--volume "$HOME":/home \
myjenkins-blueocean:1.1
docker run --name db --rm --detach \
--network jenkins \
--env POSTGRES_USER=sonar \
--env POSTGRES_PASSWORD=sonar \
--volume postgresql:/var/lib/postgresql \
--volume postgresql_data:/var/lib/postgresql/data \
postgres
docker run --name sonarqube --rm --detach \
--network jenkins \
--link jenkins-blueocean \
--env sonar.jdbc.username=sonar \
--env sonar.jdbc.password=sonar \
--env sonar.jdbc.url=jdbc:postgresql://db:5432/sonar \
--publish 9000:9000 \
--volume sonarqube_conf:/opt/sonarqube/conf \
--volume sonarqube_data:/opt/sonarqube/data \
--volume sonarqube_extensions:/opt/sonarqube/extensions \
--volume sonarqube_bundled-plugins:/opt/sonarqube/lib/bundled-plugins \
sonarqube:7.6-community
这是我在管道中使用的 Jenkinsfile。管道{代理无
stages {
stage('Build') {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2 -v /var/run/docker.sock:/var/run/docker.sock'
}
}
steps {
sh 'mvn -B -DskipTests clean package'
}
}
stage('Test') {
agent {
docker {
image 'maven:3-alpine'
args '-v /root/.m2:/root/.m2 -v /var/run/docker.sock:/var/run/docker.sock'
}
}
steps {
sh 'mvn test'
}
}
stage('Analyze') {
agent {
docker {
image 'sonarsource/sonar-scanner-cli'
args '-v /var/run/docker.sock:/var/run/docker.sock --entrypoint=""'
}
}
steps {
sh 'sonar-scanner -Dsonar.source=. -Dsonar.projectKey=com.mycompany.app:my-app -Dsonar.host.url=http://sonarqube:9000 -Dsonar.login=admin -Dsonar.password=admin'
}
}
}
}
Is there a way to force Jenkins to work with the bridge network I've created?
解决方案
为了子孙后代,这就是我解决这个问题的方法。我的主要问题是将 docker 中的 docker 与让 Jenkins 容器访问 docker 混淆。这篇文章https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/详细介绍了为什么 docker in docker 可能不是一个好主意。我遇到的具体问题是内部 docker 实例无权访问外部 docker 实例。
所以我采取的步骤:
- 在 Jenkins Dockerfile 中下载 docker
- 与 Jenkins 容器的 docker 套接字共享主机 docker 套接字
- 在主机上创建 Jenkins 用户
- 将 jenkins 用户添加到 docker 组
- 在 Jenkins Dockerfile 中手动将容器的 Jenkins 用户设置为具有相同的用户 id 和组 id 以及主机上的 Jenkins 用户。还要确保
将容器 jenkins 用户添加到 docker 组,并更改 docker 组 id 以匹配主机的 - 您现在应该能够运行容器,确保使用可以访问主机上的 jenkins 用户和 docker 组的卷
推荐阅读
- node.js - 无法在 Pycharm for javascript 中将目录标记为测试源
- c++ - 在 if 语句中使用 GetKeyState 时,它会跳过条件
- git - Github如何更新分叉的repo,和新分叉的完全一样
- docker - 无法将 localhost 与 Docker 容器一起使用
- python - 为什么未定义 selectedimage?
- android - Android上的FileDataStoreFactory和posix?
- node.js - 使函数强类型时,节点 api 服务上出现意外的令牌“:”
- javascript - 反应日期选择器和时刻
- xslt-2.0 - 在 XSLT 中对数据进行分组后计算行数
- f# - 是否可以编写一个将文件(SFTP)传输到远程服务器并在该服务器上运行一些 docker 命令的 FAKE 构建脚本?