我正在尝试针对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(从我的笔记本电脑上的shell提示符下,而不是Docker容器中运行:]
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 compose文件,该文件可让我与Dockerized的命令行调用实现的功能相同甲骨文这是我尝试过的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命令的语法是什么从我的笔记本电脑连接(即,不要在运行数据库服务器的容器)?
以下是我尝试过的许多变体中的一些(注意:我尝试使用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)))'
诊断注释:
我正在Mac上运行Docker。启动Docker化的Oracle之后,我确实在docker撰写配置正在转发的端口上看到了侦听器,如下所示:
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)
已解决问题
由于我的朋友马特(Changos Muertos)的建议,这里总结了我为解决该问题所做的工作。
1)。不需要创建桥接网络“ SampleNET”。
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/[email protected]:1521/InfraDB.us.oracle.com as SYSDBA
这取决于一些因素,例如网络类型,以及端口是否正确转发。然后在主机上进行验证(在linux'netstat -tlpn'中),这将向您显示它是否在端口上侦听,以及侦听什么接口和协议。该工具可能因主机操作系统而异。
[一旦您看到它通过tcp侦听(不仅限于tcp6),并且主机上的防火墙已打开,您可以组合该信息以创建连接字符串。