Моя конечная цель - с помощью 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.
В 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
В 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"
Есть идеи, как действовать? или что делать? Я ценю любую помощь или предоставленные мысли.