programing

Oracle이 Docker에서 작동하는지 확인하려면 어떻게 해야 합니까?

jooyons 2023. 11. 6. 21:48
반응형

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

반응형