正如标题所说:如何检查Oracle是否已在Docker中运行?现在我的应用程序尝试创建Hibernate会话,
ERROR : ORA-01033: ORACLE initialization or shutdown in progress
所以我想做一些只有网址的健康检查。可以吗?谢谢!
guz6ccqo1#
我正在使用wnameless/oracle-xe-11 g-r2,这对我很有效
version: '3' services: db: image: wnameless/oracle-xe-11g-r2 environment: - ORACLE_ALLOW_REMOTE=true ports: - 49261:1521 volumes: - ./0_init.sql:/docker-entrypoint-initdb.d/0_init.sql healthcheck: test: [ "CMD", "bash", "-c", "echo 'select 1 from dual;' | ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe /u01/app/oracle/product/11.2.0/xe/bin/sqlplus -s USERNAME/PASSWORD@localhost"] # docker inspect --format "{{json .State.Health }}" myproject_db_1 interval: 10s timeout: 10s retries: 60 myservice: image: xxx depends_on: db: condition: service_healthy
pgky5nke2#
通过使用docker-compose.yml和Official Oracle docker images,可以将checkDBStatus.sh脚本用作运行状况检查。当db处于ORA-01033状态时,该脚本返回非0值。下面是一个示例。请注意db的服务healthcheck和tomcat的depends_on与service_healthy条件的组合:
docker-compose.yml
checkDBStatus.sh
healthcheck
depends_on
service_healthy
tomcat: image: "tomcat:9.0" depends_on: oracle-db: condition: service_healthy links: - oracle-db services: oracle-db: build: context: src/main/docker/oracle_db dockerfile: Dockerfile.xe mem_reservation: 2g environment: - ORACLE_PWD=oracle volumes: - oracle-data:/opt/oracle/oradata healthcheck: test: [ "CMD", "/opt/oracle/checkDBStatus.sh"] interval: 2s volumes: oracle-data:
tag5nh1u3#
您可以在Java应用中模拟tnsping:How to do oracle TNSPING with java?如果您无法修改应用程序,可以从bash脚本调用tnsping-如果您安装了Oracle客户端;如果您没有安装Oracle客户端,只需从上面的链接创建一个简单的应用程序,并在脚本中执行它。
qlfbtfca4#
我已经完成了对APEX的简单检查:
while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' db:8080/apex)" != "302" ]]; do sleep 5; done
使用302是因为它将/apex重定向到/apex/some_stuff。在我的示例中,db是Oracle容器的名称:
version: '3' services: ... * other containers * ... db: image: some/image ports: - "8383:8080" - "1521:1521"
希望能对人有所帮助!
wkyowqbh5#
如果要在jenkinsfile中启动oracle DB Docker容器,您可能会发现以下命令很有用:
def waitForDbHealthy(containerName) { timeout(time: 4, unit: 'MINUTES') { def HEALTH_RESULT="" while (! HEALTH_RESULT.toString().contains("healthy") ) { echo "DB not yet healthy. going to sleep 10 sec." sleep 10 HEALTH_RESULT=sh(returnStdout: true, script: "docker inspect --format='{{json .State.Health.Status}}' $containerName").trim() echo "HEALTH_RESULT: $HEALTH_RESULT" if ( HEALTH_RESULT.toString().contains("unhealthy") ) { sh("docker logs $containerName") echo "Going to throw IllegalStateException" throw new IllegalStateException("Oracle DB switched to state unhealthy") } } } }
在我的构建服务器上,大约需要1分钟,容器才能“健康”。注意oracle的TNS监听器可能还没有准备好。我发现额外的“sleep 60”(秒)就可以了。或者,你可以像Krzysztof Kaszkowiak在他的回答中指出的那样实现java TNSPING。另一个注意事项:Jenkinsfile的groovy默认不允许抛出非法状态异常。您的Jenkins管理员必须明确接受它(Jenkins/管理Jenkins/进程中脚本审批)。Jenkins2.249.2Docker版本:19.03.8Oracle Docker映像:基于存储/Oracle/数据库-企业:12.2.0.1-精简
2admgd596#
对于Windows Oracle容器,不幸的是checkDBStatus.sh不可用,所以我是这样做的。按如下所示创建一个名为C:\scripts\healthcheck.ps1的文件,用您自己的密码和SID替换密码和SID。您可能应该使用权限较低的其他用户和select 1 from dual或其他用户。其思想是,当Oracle准备好接受连接时,它应该返回0,否则它应该返回1。
C:\scripts\healthcheck.ps1
select 1 from dual
# Healthcheck script that returns 0 if Oracle is ready to accept connections, else returns 1 $chekdbsql = "`nselect status from v`$instance;" $chkdb = "" $chkdb = ($chekdbsql | cmd /c "sqlplus sys/password@localhost/ora193 as sysdba") if ($chkdb.Contains("OPEN") -eq 'True'){ exit 0 } else { exit 1 }
将此行添加到Oracle数据库Dockerfile:
Dockerfile
HEALTHCHECK --interval=10s --timeout=10s --retries=20 CMD powershell C:\scripts\healthcheck.ps1
最后,在docker-compose.yaml中,将以下内容添加到依赖于oracle服务的服务的相关部分:
docker-compose.yaml
oracle
depends_on: oracle: condition: service_healthy
6条答案
按热度按时间guz6ccqo1#
我正在使用wnameless/oracle-xe-11 g-r2,这对我很有效
pgky5nke2#
通过使用
docker-compose.yml
和Official Oracle docker images,可以将checkDBStatus.sh
脚本用作运行状况检查。当db处于ORA-01033状态时,该脚本返回非0值。下面是一个示例。请注意db的服务healthcheck
和tomcat的depends_on
与service_healthy
条件的组合:tag5nh1u3#
您可以在Java应用中模拟tnsping:How to do oracle TNSPING with java?
如果您无法修改应用程序,可以从bash脚本调用tnsping-如果您安装了Oracle客户端;如果您没有安装Oracle客户端,只需从上面的链接创建一个简单的应用程序,并在脚本中执行它。
qlfbtfca4#
我已经完成了对APEX的简单检查:
使用302是因为它将/apex重定向到/apex/some_stuff。在我的示例中,db是Oracle容器的名称:
希望能对人有所帮助!
wkyowqbh5#
如果要在jenkinsfile中启动oracle DB Docker容器,您可能会发现以下命令很有用:
在我的构建服务器上,大约需要1分钟,容器才能“健康”。
注意oracle的TNS监听器可能还没有准备好。我发现额外的“sleep 60”(秒)就可以了。或者,你可以像Krzysztof Kaszkowiak在他的回答中指出的那样实现java TNSPING。
另一个注意事项:Jenkinsfile的groovy默认不允许抛出非法状态异常。您的Jenkins管理员必须明确接受它(Jenkins/管理Jenkins/进程中脚本审批)。
Jenkins2.249.2
Docker版本:19.03.8
Oracle Docker映像:基于存储/Oracle/数据库-企业:12.2.0.1-精简
2admgd596#
对于Windows Oracle容器,不幸的是checkDBStatus.sh不可用,所以我是这样做的。
按如下所示创建一个名为
C:\scripts\healthcheck.ps1
的文件,用您自己的密码和SID替换密码和SID。您可能应该使用权限较低的其他用户和select 1 from dual
或其他用户。其思想是,当Oracle准备好接受连接时,它应该返回0,否则它应该返回1。将此行添加到Oracle数据库
Dockerfile
:最后,在
docker-compose.yaml
中,将以下内容添加到依赖于oracle
服务的服务的相关部分: