Dockerfile调用docker-compose的db服务执行sqlplus报错ORA-12504求助
问题:Docker Compose中sqlplus连接Oracle容器抛出ORA-12504错误
我在Dockerfile里通过docker-compose的db服务执行sqlplus命令,尝试连接对应的Oracle容器,但一直抛出ORA-12504错误。这个命令直接在容器内执行时能正常运行,求排查思路。
docker-compose配置
version: '2.4' services: db: image: oracle19c:new environment: - ORACLE_SID=ORCLCDB - ORACLE_PDB=ORCLPDB1 - ORACLE_PWD=password ports: - 1521:1521 volumes: #- oracle:/opt/oracle/oradata #- ./scripts:/scripts #- ./software:/software - ./scripts/:/opt/oracle/scripts/startup/ - ./utPLSQL-develop/utPLSQL-develop/:/tmp/utPLSQL/ healthcheck: test: [ "CMD", "/opt/oracle/checkDBStatus.sh"] interval: 10s timeout: 10s retries: 190 utplsql: build: ./ depends_on: db: condition: service_healthy environment: - ORACLE_SID=ORCLCDB - ORACLE_PDB=ORCLPDB1 - ORACLE_PWD=password
Dockerfile内容
FROM oracle19c:new # Setup ORACLE ENV ENV ORACLE_SID=ORCLCDB ENV ORACLE_PDB=ORCLPDB1 ENV ORACLE_PWD=password # Set up the command to wait for the Oracle DB, then install utPLSQL CMD sqlplus sys/password123@db:1521/ORCLPDB1 as sysdba @/tmp/utPLSQL/source/install_headless.sql
报错信息
compose-utplsql-1 | compose-utplsql-1 | SQL*Plus: Release 19.0.0.0.0 - Production on Thu Oct 12 16:25:30 2023 compose-utplsql-1 | Version 19.3.0.0.0 compose-utplsql-1 | compose-utplsql-1 | Copyright (c) 1982, 2019, Oracle. All rights reserved. compose-utplsql-1 | compose-utplsql-1 | compose-utplsql-1 | ERROR: compose-utplsql-1 | ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA compose-utplsql-1 | compose-utplsql-1 | compose-utplsql-1 | Enter user-name: compose-utplsql-1 exited with code 0
排查与解决思路
密码不一致问题:Dockerfile中硬编码的密码是
password123,但docker-compose和环境变量里设置的ORACLE_PWD是password,两者不匹配。这不仅会导致认证失败,也可能触发类似的连接错误提示,先统一密码为password,或者改用环境变量构建连接字符串:CMD sqlplus sys/${ORACLE_PWD}@db:1521/${ORACLE_PDB} as sysdba @/tmp/utPLSQL/source/install_headless.sql连接字符串格式验证:尝试使用完整的TNS格式连接,避免解析问题:
sqlplus sys/password@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLPDB1)))" as sysdba @/tmp/utPLSQL/source/install_headless.sql确认服务名注册状态:进入db容器执行
lsnrctl status,查看listener是否已经正确注册了ORCLPDB1服务。有时候PDB的服务名可能未及时注册,需要等待listener完成同步。测试网络连通性:在utplsql容器内执行
ping db确认网络可达,再用tnsping db:1521/ORCLPDB1测试Oracle listener是否能正常响应连接请求。检查健康检查逻辑:虽然设置了
service_healthy,但可以确认checkDBStatus.sh是否真的验证了PDB的可用性。有些默认检查可能只验证CDB,需要确保PDB已经打开并可用。
内容的提问来源于stack exchange,提问作者Raj24
相关产品推荐
相关产品推荐

