Я пытаюсь настроить автоматические интеграционные тесты для базы данных Oracle и планирую использовать https://www.testcontainers.org/ для запуска контейнеров в моем docker -compose.yml.
Мне удалось запустить Dockerized Oracle на моем ноутбуке, используя следующие инструкции: https://github.com/oracle/docker-images/tree/master/OracleWebLogic/samples/12212-oradb-wlsstore
Шаги:
# see https://docs.oracle.com/cd/E37670_01/E75728/html/oracle-registry-server.html
docker login container-registry.oracle.com # supply your oracle credentials as described above
docker network create -d bridge SampleNET
cat > env.txt <<EOF
DB_SID=InfraDB
DB_PDB=InfraPDB1
DB_DOMAIN=us.oracle.com
DB_BUNDLE=basic
EOF
docker run -d --name InfraDB --network=SampleNET -p 1521:1521 -p 5500:5500 --env-file env.txt -it --shm-size="8g" store/oracle/database-enterprise:12.2.0.1
Через минуту когда я запускаю команду "sudo docker ps -a", я вижу, что БД работает и исправна.
CONTAINER ID IMAGE COMMAND
6a276a311b2e store/oracle/database-enterprise:12.2.0.1 "/bin/sh -c '/bin/ba…"
CREATED STATUS PORTS
2 minutes ago Up 2 minutes (healthy) 0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp
NAMES
InfraDB
И теперь я могу запустить sqlplus (из командной строки на моем ноутбуке, а не * Контейнер 1066 *):
sqlplus sys/Oradoc_db1@localhost:1521/InfraDB.us.oracle.com AS SYSDBA
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL>
Теперь моя цель - создать файл компоновки Docker, который позволит мне сделать то же самое, что было достигнуто с помощью вызова командной строки Dockerized Oracle. Вот файл docker -compose.yml, который я пробовал:
version: '2'
services:
database:
image: store/oracle/database-enterprise:12.2.0.1
ports:
- 1521:1521
- 8080:8080
- 5500:5500
environment:
- DB_SID:InfraDB
- DB_PDB:InfraPDB1
- DB_DOMAIN:us.oracle.com
- DB_BUNDLE:basic
networks:
default:
external:
name: SampleNET
Итак, с помощью этого файла docker compose я могу запустить оболочку в контейнере, где работает моя Oracle DB, и запустить sqlplus:
container=`sudo docker ps -a | grep oracle | sed -e's/\s.*//'`
sudo docker exec -t -i $container bash
# SESSION INSIDE DOCKER CONTAINER:
[oracle@8f26f224db03 /]$ sqlplus sys/Oradoc_db1 AS SYSDBA
SQL*Plus: Release 12.2.0.1.0 Production on Tue Mar 3 02:44:03 2020
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Теперь вопрос на миллион долларов:
Каков синтаксис команды sqlplus, которую я хотел бы указать для подключения FROM MY LAPTOP (т. Е. Не запускать оболочку в контейнере, на котором выполняется Сервер БД)?
Вот несколько вариантов, которые я пробовал (примечание: я пробовал использовать localhost, 127.0.0.1 и фактический IP-адрес моего ноутбука):
sqlplus sys/Oradoc_db1@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=InfraDB)))'
sqlplus sys/Oradoc_db1@'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=InfraDB.us.oracle.com)))'
Диагностика c Примечание:
Я бегу Docker на Ма c. После запуска Docker -ized Oracle я вижу прослушиватели на портах, которые перенаправляет конфигурация docker compose, как показано ниже:
sudo lsof -i -P | grep -i "listen" | egrep "1521|8080|5500"
com.docke 6295 christopher.bedford 33u IPv6 0xfffffffffffffff 0t0 TCP *:1521 (LISTEN)
com.docke 6295 christopher.bedford 34u IPv6 0xfffffffffffffff 0t0 TCP *:5500 (LISTEN)
com.docke 6295 christopher.bedford 38u IPv6 0xfffffffffffffff 0t0 TCP *:8080 (LISTEN)
Проблема решена
Вот краткое изложение того, что я сделал для решения проблемы благодаря предложению моего друга Мэтта (Чангос Муэртос ниже).
1). создание мостовой сети 'Sampl eNET' не требуется.
2). похоже, что указание переменных окружения встроенным, как это (ниже) не работает
environment:
- DB_SID:InfraDB
- DB_PDB:InfraPDB1
- DB_DOMAIN:us.oracle.com
- DB_BUNDLE:basic
3). Вместо этого лучше определить эти параметры среды в файле, на который ссылается опция конфигурации 'env_file', как показано ниже. Этот файл находится в /tmp/docker-compose.yml
version: '2'
services:
database:
image: store/oracle/database-enterprise:12.2.0.1
ports:
- 1521:1521
- 8080:8080
- 5500:5500
env_file:
- e2.txt
. Содержимое файла env находится в том же каталоге (/tmp/e2.txt) и имеет следующее содержимое:
DB_SID=InfraDB
DB_PDB=InfraPDB1
DB_DOMAIN=us.oracle.com
DB_BUNDLE=basic
Для запуска я делаю
docker-compose -f /tmp/docker-compose.yml up
, а затем я могу подключиться (с моего ноутбука, как это было первоначальной целью) через:
sqlplus sys/Oradoc_db1@0.0.0.0:1521/InfraDB.us.oracle.com as SYSDBA