首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Jenkins Pipeline中访问本地运行的容器

在Jenkins Pipeline中访问本地运行的容器
EN

Stack Overflow用户
提问于 2020-12-01 05:31:08
回答 1查看 253关注 0票数 0

我正在尝试使用Docker来运行Jenkins和Sonarqube。然后在Jenkins中,我想使用管道设置一个作业来构建和测试应用程序,然后使用sonarscan运行扫描。

我的问题似乎与网络有关,因为在Jenkins管道中,我无法通过dns名称访问SonarQube容器IP。当我手动找到该容器的内部IP并将其放入Jenkinsfile中时,我没有遇到任何问题。

下面是我用来启动所有容器的docker命令(由于WSL问题,我没有转到docker-compose )。

代码语言:javascript
复制
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。管道{代理无

代码语言:javascript
复制
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'
        }
    }
 }

}

代码语言:javascript
复制
Is there a way to force Jenkins to work with the bridge network I've created?
EN

回答 1

Stack Overflow用户

发布于 2020-12-09 03:33:07

为了后人着想,下面是我是如何解决这个问题的。我的主要问题是混淆docker中的docker和给Jenkins容器访问docker。这篇名为https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/的文章详细介绍了为什么在docker中使用docker可能不是一个好主意。我遇到的具体问题是内部docker实例无法访问外部docker实例。

所以我采取的步骤是:

在Jenkins Dockerfile

  • Share中下载docker使用Jenkins容器的docker套接字

  • 在主机上创建一个jenkins用户

  • 将Jenkins用户添加到Jenkins docker文件内的docker组

  • 手动设置容器的Jenkins用户具有相同的用户id和组id以及主机上的Jenkins用户。同时也要确保

将容器jenkins用户添加到停靠者组,并更改停靠者组id以匹配主机machine's

  • You现在应该能够运行容器,请确保使用可以授予主机

上的jenkins用户和停靠者组访问权限的卷

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65081455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档