正如标题所说:我如何检查Oracle是否在Docker中运行?现在我的应用程序尝试创建一个Hibernate会话,我正在
ERROR :
ORA-01033: ORACLE initialization or shutdown in progress
所以我想要一些只有网址的健康检查。那可能吗?谢谢!
答案 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"
希望它有所帮助!