You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:13:26