Oracle이 Docker에서 작동하는지 확인하려면 어떻게 해야 합니까?
제목에 나와 있듯이 Oracle이 Docker에서 작동하는지 확인하려면 어떻게 해야 합니까?이제 앱에서 최대 절전 모드 세션을 생성하려고 하면 다음과 같은 메시지가 표시됩니다.
ERROR :
ORA-01033: ORACLE initialization or shutdown in progress
그래서 url만 있는 건강검진을 원합니다.그게 가능한가요?감사해요!
사용.docker-compose.yml사용할 수 있는 공식 Oracle 도커 이미지checkDBStatus.sh건강 진단으로 스크립트를 작성합니다.이 스크립트는 db가 ORA-01033 상태인 동안 0이 아닌 값을 반환합니다.아래는 예시입니다.db의 서비스 결합을 주목합니다.healthcheck그리고 톰캣의depends_on와 함께service_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:
저는 wnamless/ 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
자바 앱에서 tnsping을 흉내 낼 수 있습니다.자바로 오라클 TNSPING을 하는 방법?
앱을 수정할 수 없는 경우 Oracle 클라이언트가 설치되어 있는 경우 bash 스크립트에서 tnsping을 호출할 수 있습니다.그렇지 않은 경우 위 링크에서 간단한 응용프로그램을 만들어 스크립트로 실행하기만 하면 됩니다.
jenkins 파일 내에서 Oracle DB 도커 컨테이너를 시작하는 경우 다음과 같은 유용한 정보를 얻을 수 있습니다.
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"(초)을 추가로 사용하면 효과가 있다는 것을 알았습니다.또는 Kaszkowiak의 Krzyszt가 그의 답변에서 지적한 대로 java TNSPING을 구현할 수 있습니다.
다른 참고 사항:Jenkins 파일의 그루비에서는 기본값마다 LegalStateException을 허용하지 않습니다.Jenkins 관리자가 명시적으로 수락해야 합니다(Jenkins/Manage Jenkins/Inprocess Script Approval).
젠킨스 2.249.2
도커 버전: 19.03.8
Oracle 도커 이미지: 스토어/오라클/데이터베이스 기반-엔터프라이즈: 12.2.0.1-slim
윈도우즈 Oracle 컨테이너의 경우 DB 상태를 확인해야 합니다.그녀는 시간이 없어서 이렇게 했습니다.
다음 파일을 만듭니다.C:\scripts\healthcheck.ps1다음과 같이 비밀번호와 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 DB에 추가Dockerfile:
HEALTHCHECK --interval=10s --timeout=10s --retries=20 CMD powershell C:\scripts\healthcheck.ps1
마지막으로, 당신의docker-compose.yaml당신에게 의존하는 서비스를 위해 관련 섹션에 다음을 추가합니다.oracle서비스:
depends_on:
oracle:
condition: service_healthy
APEX에 대한 간단한 확인을 마쳤습니다.
while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' db:8080/apex)" != "302" ]]; do sleep 5; done
302는 /apex/some_stuff로 리디렉션하기 때문에 사용됩니다.제 경우 db는 Oracle이 포함된 컨테이너의 이름입니다.
version: '3'
services:
...
* other containers *
...
db:
image: some/image
ports:
- "8383:8080"
- "1521:1521"
누군가에게 도움이 되길 바랍니다!
언급URL : https://stackoverflow.com/questions/50217637/how-do-i-check-if-oracle-is-up-in-docker
'programing' 카테고리의 다른 글
| jQuery $(문서).준비() 두 번 발사 (0) | 2023.11.06 |
|---|---|
| 배열의 두 번째에서 마지막 항목을 얻습니까? (0) | 2023.11.06 |
| 이 오류는 무엇을 의미합니까? 'somefile.c:200: error: 1032바이트의 프레임 크기가 1024바이트보다 큽니다.' (0) | 2023.11.06 |
| 위조 방지를 해결하는 방법내 ASP에서 i가 재설정된 후 발생하는 토큰 예외.넷 MVC 앱? (0) | 2023.11.06 |
| 길이 또는 정수의 최대값을 정의하는 상수가 있습니까? (0) | 2023.11.06 |