在本文(https://faun.pub/how-to-install-docker-in-jenkins-container-4c49ba40b373)的帮助下,我在Docker中部署了Jenkins,因为它与主机的Docker sock连接,允许Docker中的Jenkins管理主机中的Docker。
现在,我已经将postgres部署为docker容器,并将5432暴露给主机。DB已经初始化并按预期工作。
在管道中,我用docker运行flyway,并使用conf和sql文件,这意味着jenkins会尝试在我的主机中将flyway作为docker容器运行。不,无论我在“flyway.url”中给予什么,它都不会连接到DB。
错误:无法连接到数据库。请配置url、用户和密码!
配置文件\路径.配置文件
flyway.url=jdbc:postgresql://192.168.29.2:5432/postgres
flyway.user=postgres
flyway.password=alpine98
flyway.connectRetries=60
Jenkins菲尔
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Temp'){
steps {
sh 'docker ps'
}
}
stage('Version Check'){
steps {
sh 'docker run --rm flyway/flyway:9.15 version'
}
}
stage('Migration') {
steps {
sh 'docker run --rm -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 migrate'
}
}
stage('Validation') {
steps {
sh 'docker run --rm -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 validate'
}
}
stage('Information') {
steps {
sh 'docker run --rm -v $WORKSPACE/db/migration:/flyway/sql -v $WORKSPACE/conf:/flyway/conf flyway/flyway:9.15 info'
}
}
}
}
主机中运行的Docker容器列表:
- Jenkins -172.17.0.2-暴露端口8080和50000
- Postgres -172.17.0.3-暴露端口5432
- Flyway(将在jenkins作业运行时启动)
- 由于所有设备都是在没有网络的情况下部署的,因此所有设备都Map在默认的“网桥”网络下 *
Jenkins作业输出
+ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52365808825e portainer/portainer-ce:latest "/portainer" 13 hours ago Up 13 hours 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp portainer
ed6e91f86feb gitea/gitea:1.18.5 "/usr/bin/entrypoint…" 13 hours ago Up 13 hours 0.0.0.0:3000->3000/tcp, :::3000->3000/tcp, 0.0.0.0:222->22/tcp, :::222->22/tcp gitea
fa32180a9a8c postgres "docker-entrypoint.s…" 13 hours ago Up 13 hours 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp postgres
1f169b2b6f9c jenkins/jenkins:lts "/usr/bin/tini -- /u…" 13 hours ago Up 12 hours 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp jenkins
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Version Check)
[Pipeline] sh
+ docker run --rm flyway/flyway:9.15 version
Flyway Community Edition 9.15.2 by Redgate
Plugin Name | Version | Licensed
--------------------- | ------- | --------
SqlFluffRulesEngine | 1.2.1 | Licensed
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Migration)
[Pipeline] sh
+ docker run --rm -v /var/jenkins_home/workspace/ecp-flyway-integration_main/db/migration:/flyway/sql -v /var/jenkins_home/workspace/ecp-flyway-integration_main/conf:/flyway/conf flyway/flyway:9.15 migrate
ERROR: Unable to connect to the database. Configure the url, user and password!
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Validation)
Stage "Validation" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Information)
Stage "Information" skipped due to earlier failure(s)
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // withEnv
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 1
Finished: FAILURE
请协助我解决这个问题。
1条答案
按热度按时间wfauudbj1#
默认网桥网络”“被视为Docker的旧版详细信息,不建议用于生产”“。您应该始终使用
docker network create
网络,然后使用docker run --net
该网络上的容器。您将需要删除并重新创建数据库容器。但是如果您使用
那么网络
a_network
上的任何容器都可以使用容器名database
作为主机名。您永远不需要知道任何有关容器私有IP地址的信息。通过此设置,您可以在Flyway配置中使用该主机名
当你实际运行容器时,你需要把它们放到网络上
这是Jenkins's Docker support稍有欠缺的地方:虽然几乎总是需要
--net
选项,但如果使用该路径运行容器,则需要在选项列表中显式提供该选项。