簡體   English   中英

Jenkins 腳本管道與 sidecar MYSQL 容器用於測試

[英]Jenkins scripted pipeline with sidecar MYSQL container for testing

我有下面的管道可以將實際容器與 MYSQL 容器一起運行以運行測試。

stage('Test - To check MYSQL connect') { 
        def dockerfile = 'Dockerfile.test'
        def mysql = docker.image('mysql:5.6').run('-e MYSQL_ALLOW_EMPTY_PASSWORD=yes')
        docker.build("rds-test", "-f ${dockerfile} .")
        def rds_test_image = docker.image('rds-test')
        rds_test_image.inside("--link ${mysql.id}:mysql "){
            sh 'echo "Inside Container"'
        }
    }

我被下面的錯誤困住了

Successfully tagged rds-test:latest
[Pipeline] isUnix
[Pipeline] sh
+ docker inspect -f . rds-test
.
[Pipeline] withDockerContainer
Jenkins seems to be running inside container d4e0934157d5eb6a9edadef31413d0da44e0e3eaacbb1719fc8d47fbf0a60a2b
$ docker run -t -d -u 1000:1000 --link d14340adbef9c95483d0369857dd000edf1b986e9df452b8faaf907fe9e89bf2:mysql -w /var/jenkins_home/workspace/test-jenkinsfile-s3-rds-backup --volumes-from d4e0934157d5eb6a9edadef31413d0da44e0e3eaacbb1719fc8d47fbf0a60a2b -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** rds-test cat
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.io.IOException: Failed to run image 'rds-test'. Error: docker: Error response from daemon: Cannot link to a non running container: /sharp_sanderson AS /fervent_lewin/mysql.

以防萬一您想查看 rds-test dockerfile https://github.com/epynic/rds-mysql-s3-backup/tree/feature

運行容器的 id 不會在run方法的返回中捕獲,而是存儲在withRun塊的臨時 lambda 變量中。 為了利用此功能,我們將相應地修改您的代碼:

stage('Test - To check MYSQL connect') { 
  def dockerfile = 'Dockerfile.test'
  docker.build("rds-test", "-f ${dockerfile} .")
  def rds_test_image = docker.image('rds-test')

  docker.image('mysql:5.6').withRun('-e MYSQL_ALLOW_EMPTY_PASSWORD=yes') { container ->
    rds_test_image.inside("--link ${container.id}:mysql") {
      sh 'echo "Inside Container"'
    }
  }
}

正如你在上面看到的,在另一個容器的withRun的代碼塊中運行你的第二個容器使得容器 id 可以在塊內初始化的臨時 lambda 變量的id成員變量中訪問(為了方便起見,這里命名為container )。

請注意,您還可以通過將rds_test_image的值分配給docker.build("rds-test", "-f ${dockerfile} .")的返回值來進行輕微的代碼清理docker.build("rds-test", "-f ${dockerfile} .")而不是添加另一行代碼來分配它返回docker.image('rds-test') 新代碼也會更加穩定。

上述情況是因為 mysql 容器在--link with Matt Schuchard建議更新答案之前--link

stage('Test - To check MYSQL connect') { 
    def dockerfile = 'Dockerfile.test'
    docker.build("rds-latest", "-f ${dockerfile} .")
    def rds_test_image = docker.image('rds-test:latest')
    docker.image('mysql:5.6').withRun('-e MYSQL_ROOT_PASSWORD=admin --name=mysql_server -p 3306:3306') { container ->
        docker.image('mysql:5.6').inside("--link ${container.id}:mysql") {
            /* Wait until mysql service is up */
            sh 'while ! mysqladmin ping -hmysql --silent; do sleep 1; done'
        }

        rds_test_image.inside("--link ${container.id}:mysql -e MYSQL_HOST=mysql -e MYSQL_PWD=admin -e USER=root "){
            sh 'bash scripts/test_script.sh'
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM