Назад | Перейти на главную страницу

Как подключить контейнер докеров python к контейнеру Oracle

Моя конечная цель - с помощью docker-compose подключить приложение Python к базе данных Oracle.

В настоящее время приложение python использует SQLAlchemy за попытку подключиться к Oracle. Я также пробовал использовать cx_Oracle напрямую, но получил те же ошибки. У меня также установлен мгновенный клиент Oracle в контейнере python.

Для Oracle я использую store/oracle/database-enterprise:12.2.0.1 изображение из Docker, а при запуске контейнера базы данных из журналов я получаю следующее: ERROR: config DB failed, please check log /home/oracle/setup/log/configDB.log for details!

Затем в configDB.log Имею следующее:

Mon Nov 25 23:35:54 UTC 2019
Start Docker DB configuration
Call configDBora.sh to configure database
Mon Nov 25 23:35:54 UTC 2019
Configure DB as oracle user
Setup Database directories ...
startup database instance

SQL*Plus: Release 12.2.0.1.0 Production on Mon Nov 25 23:35:55 2019

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

Connected to an idle instance.

SQL> ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01262: Stat failed on a file destination directory
Linux-x86_64 Error: 2: No such file or directory
SQL> Disconnected

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 25-NOV-2019 23:35:56

Copyright (c) 1991, 2016, Oracle.  All rights reserved.

Starting /u01/app/oracle/product/12.2.0/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/a7b10c9a8f22/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0.0.0.0)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.2.0.1.0 - Production
Start Date                25-NOV-2019 23:35:57
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/12.2.0/dbhome_1/admin/ORCLCDB/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/a7b10c9a8f22/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
The listener supports no services
The command completed successfully

DONE!
Remove password info
Docker DB configuration is complete !

Отсюда я могу выделить две проблемы, первая связана с db_recovery_file_dest а второй - о слушателе Oracle.

db_recovery_file_dest:

В configDB.log мы можем найти:

SQL> ORA-01261: Parameter db_recovery_file_dest destination string cannot be translated
ORA-01262: Stat failed on a file destination directory
Linux-x86_64 Error: 2: No such file or directory
SQL> Disconnected

Для этого я проверил папку, указанную для db_recovery_file_dest который /u03/app/oracle/fast_recovery_area и кажется, что это неработающая ссылка, так как на ней красные буквы на черном фоне. Затем я создал карту объема на моем docker-compose.yml чтобы увидеть, что произойдет, и это решит ошибку, которая теперь приводит к аналогичной проблеме с папкой файла аудита. Попытавшись решить таким же образом, я получил:

db_1   | ln: failed to create symbolic link '/u02/app/oracle/audit/audit': Permission denied
db_1   | ln: failed to create symbolic link '/u02/app/oracle/oradata': Permission denied
db_1   | ln: failed to create symbolic link '/u03/app/oracle/fast_recovery_area/fast_recovery_area': File exists

Слушатель Oracle

В configDB.log у нас есть: The listener supports no services. Я считаю, что это прямая причина следующей ошибки в контейнере python: cx_Oracle.DatabaseError: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Я проверил файл listener.ora и он не содержит SID_LIST_LISTENER. У меня есть локальная версия listener.ora содержащие эту информацию, однако я не знаю, как я могу использовать свой listener.ora в службе Oracle. Я попытался создать для этого карту объема, но это не сработало.


Ниже приводится база docker-compose.yml Я использую:

version: '3'
services:
  mdc:
    image: mdc-lite
    build: .
    volumes:
      - .:/usr/src/app
    links:
      - db:db
    networks:
      - appnet
    ports:
      - 7070:7070
    command: python3 /usr/src/app/manage.py runserver 0.0.0.0:7070
    environment:
      # https://github.com/awslabs/amazon-sagemaker-examples/issues/319
      PYTHONUNBUFFERED: 1

  db:
    image: store/oracle/database-enterprise:12.2.0.1
    volumes:
      - dbdata:/ORCL
      - ./database-scripts:/scripts
    networks:
      - appnet
    ports:
      - 1521:1521
      - 5500:5500
    ulimits:
      # necessary to get rid of a memlock message
      memlock: 6000000000
    shm_size: '2gb'
    environment:
      ORACLE_SID: ORCLCDB
      ORACLE_PDB: ORCLPDB1
      ORACLE_PWD: secret

networks:
  appnet:
    driver: 'bridge'

volumes:
  dbdata:
    driver: "local"

Есть идеи, как действовать? или что делать? Я ценю любую помощь или предоставленные мысли.