我有以下管道,它将与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.image('rds-test')的返回值。新代码也将更加稳定。

10-08 08:26
查看更多