如何检查Oracle是否在Docker中?
正如标题所说:我如何检查Oracle是否在Docker中?现在我的应用程序尝试创建一个Hibernate会话,我得到了如何检查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客户端。如果没有,只需从上面的链接创建一个简单的应用程序
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。将编辑答案