Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查Oracle是否在Docker中?_Oracle_Docker_Docker Compose_Dockerfile - Fatal编程技术网

如何检查Oracle是否在Docker中?

如何检查Oracle是否在Docker中?,oracle,docker,docker-compose,dockerfile,Oracle,Docker,Docker Compose,Dockerfile,正如标题所说:我如何检查Oracle是否在Docker中?现在我的应用程序尝试创建一个Hibernate会话,我得到了 ERROR : ORA-01033: ORACLE initialization or shutdown in progress 所以我想做一些只有url的健康检查。可能吗?谢谢大家! 您可以在Java应用程序中模拟tnsping: 如果您无法修改应用程序,则可以从bash脚本调用tnsping-如果您安装了Oracle客户端。如果没有,只需从上面的链接创建一个简单的应用程序

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

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

所以我想做一些只有url的健康检查。可能吗?谢谢大家!

您可以在Java应用程序中模拟tnsping:


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

我完成了对APEX的简单检查:

while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' db:8080/apex)" != "302" ]]; do sleep 5; done
之所以使用302,是因为它将/apex重定向到/apex/某些内容。在我的例子中,db是包含Oracle的容器的名称:

version: '3'
services:
  ...
  * other containers *
  ...
  db:
    image: some/image
    ports:
      - "8383:8080"
      - "1521:1521"

希望它能帮助别人

我使用的是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

如果要在Jenkins文件中启动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秒”就可以了。或者,您可以将JavaTNSping实现为 Krzysztof Kaszkowiak在回答中指出

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

詹金斯2.249.2

Docker版本:19.03.8


Oracle docker image:基于store/Oracle/database enterprise:12.2.0.1-slim

据我所知,需要更改代码。但是有没有一种方法可以像curl或wget那样进行检查?没有,Oracle没有默认的web界面,因为这会给数据库带来巨大的安全风险。这就是应用服务器的用途。通常人们编写或修改Web应用程序来进行数据库运行状况检查。@Krzysztof Kaszkowiak这真的很有帮助!我尝试过docker exec-t oracle tnsping orcl,但它挂起了。您可以尝试使用无效的用户名/密码进行连接。如果ORA-1017(无效的用户名/密码)启动,您应该返回,如果未启动,您将获得其他内容?有趣。它是用于带有db的容器的正式dockerfile oracle版本吗?我有一个自己的派生版本,基于官方映像存储/oracle/database enterprise:12.2.0.1-slim。将编辑答案