M1 Mac通过Docker Compose启动Oracle XE容器遇ORA-01017认证失败
我使用搭载Apple M1芯片的MacBook,通过Colima在M1芯片上运行Oracle容器,需要在Oracle容器上执行集成测试,因此尝试通过docker-compose.yaml定义的服务创建Oracle容器。
容器能成功启动,但无法通过本地安装的SQL Developer工具登录,出现认证错误:
Status : Failure -Test failed: ORA-01017: invalid username/password; logon denied.
奇怪的是,使用以下docker run命令启动容器,就能通过SQL Developer正常登录数据库(用户名SYS,密码secret):
docker run --name devdb -p 1521:1521 -p 5500:5500 -e ORACLE_PWD=secret container-registry.oracle.com/database/express:21.3.0-xe
而使用以下docker-compose.yaml文件启动容器时,会出现数据库登录问题:
version: '3' services: oracle: image: container-registry.oracle.com/database/express:21.3.0-xe hostname: oracle container_name: oracle ports: - 1521:1521 - 5500:5500 environment: - ORACLE_PWD:secret volumes: - ./scripts/startup:/opt/oracle/scripts/startup
Oracle服务器启动日志显示数据库已成功启动且无错误,移除hostname、containerName和自定义启动脚本配置后问题依旧,尝试使用默认密码CHANGE_ON_INSTALL搭配SYS用户名也无法登录。
请问是什么原因导致认证失败?使用docker-compose命令时是否需要显式提供tnsnames.ora或其他配置?
问题出在docker-compose的环境变量配置格式错误。你当前写的- ORACLE_PWD:secret是错误的写法:在environment的列表格式中,变量名和值需要用=分隔;如果用YAML字典格式,则不需要加-。
正确的配置方式有两种:
- 列表格式(使用
=分隔):
environment: - ORACLE_PWD=secret
- 字典格式:
environment: ORACLE_PWD: secret
错误写法会让docker-compose把ORACLE_PWD:secret整个字符串识别为环境变量名,导致Oracle容器根本没接收到正确的ORACLE_PWD变量,自然无法用预设的密码登录。
不需要额外配置tnsnames.ora,修正环境变量格式后,用用户名SYS和密码secret即可正常登录。
内容的提问来源于stack exchange,提问作者Gunjan Shah

