如何检查Oracle是否在Docker中运行?

fquxozlt  于 2023-03-17  发布在  Oracle
关注(0)|答案(6)|浏览(196)

正如标题所说:如何检查Oracle是否已在Docker中运行?现在我的应用程序尝试创建Hibernate会话,

ERROR :
ORA-01033: ORACLE initialization or shutdown in progress

所以我想做一些只有网址的健康检查。可以吗?谢谢!

guz6ccqo

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
pgky5nke

pgky5nke2#

通过使用docker-compose.ymlOfficial Oracle docker images,可以将checkDBStatus.sh脚本用作运行状况检查。当db处于ORA-01033状态时,该脚本返回非0值。下面是一个示例。请注意db的服务healthcheck和tomcat的depends_onservice_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:
tag5nh1u

tag5nh1u3#

您可以在Java应用中模拟tnsping:How to do oracle TNSPING with java?
如果您无法修改应用程序,可以从bash脚本调用tnsping-如果您安装了Oracle客户端;如果您没有安装Oracle客户端,只需从上面的链接创建一个简单的应用程序,并在脚本中执行它。

qlfbtfca

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"

希望能对人有所帮助!

wkyowqbh

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.2
Docker版本:19.03.8
Oracle Docker映像:基于存储/Oracle/数据库-企业:12.2.0.1-精简

2admgd59

2admgd596#

对于Windows Oracle容器,不幸的是checkDBStatus.sh不可用,所以我是这样做的。
按如下所示创建一个名为C:\scripts\healthcheck.ps1的文件,用您自己的密码和SID替换密码和SID。您可能应该使用权限较低的其他用户和select 1 from dual或其他用户。其思想是,当Oracle准备好接受连接时,它应该返回0,否则它应该返回1。

# 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

HEALTHCHECK --interval=10s --timeout=10s --retries=20 CMD powershell C:\scripts\healthcheck.ps1

最后,在docker-compose.yaml中,将以下内容添加到依赖于oracle服务的服务的相关部分:

depends_on: 
  oracle:
      condition: service_healthy

相关问题