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
方法的return捕获,而是存储在[=12=的临时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} .")
的 return 而不是添加另一行代码将其分配给return 个 docker.image('rds-test')
。新代码也会更稳定。
上述情况是因为 mysql 容器在 --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'
}
}
}
我有下面的管道 运行 实际容器和 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
方法的return捕获,而是存储在[=12=的临时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} .")
的 return 而不是添加另一行代码将其分配给return 个 docker.image('rds-test')
。新代码也会更稳定。
上述情况是因为 mysql 容器在 --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'
}
}
}