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

时间:2018-05-07 15:25:43

标签: oracle docker docker-compose dockerfile

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

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

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

4 个答案:

答案 0 :(得分:1)

您可以在Java应用中模仿tnsping:How to do oracle TNSPING with java?

如果您无法修改应用,可以从bash脚本调用tnsping - 如果您安装了Oracle客户端。如果您不这样做,只需从上面的链接创建一个简单的应用程序,然后在脚本中执行它。

答案 1 :(得分:1)

我正在使用wnameless / oracle-xe-11g-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

答案 2 :(得分:1)

如果您在 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 侦听器可能尚未准备就绪。我发现额外的“睡眠 60”(秒)可以解决问题。或者,您可以将 java TNSPING 实现为 Krzysztof Kaszkowiak 在他的回答中指出。

另一个注意事项:在 Jenkinsfile 的 groovy 中,默认情况下不允许抛出 IllegalStateException。您的 Jenkins 管理员必须明确接受(Jenkins/Manage Jenkins/In-process Script Approval)。

詹金斯 2.249.2

Docker 版本:19.03.8

Oracle docker 镜像:基于 store/oracle/database-enterprise:12.2.0.1-slim

答案 3 :(得分:0)

我已经完成了对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"

希望它有所帮助!