优先使用Oracle官方镜像container-registry.oracle.com/database/enterprise:19.3.0.0,需先docker login该地址;挂载目录须绝对路径且chmod 777;ORACLE_PWD避免shell特殊字符,推荐纯字母数字;数据库就绪以日志“DATABASE IS READY TO USE!”为准。
能直接用官方现成镜像就别自己构建 dockerfile,除非你有合规审计或定制内核参数的硬性要求。自行构建耗时长、失败点分散,90% 的卡顿都出在权限、路径、密码解析和 ulimit 上。
必须用 Oracle 官方新地址:container-registry.oracle.com/database/enterprise:19.3.0.0。旧地址如 store/oracle/database:19.0.0.0 或 oracle/database:19.3.0-ee 已下线,拉取必报 403。
docker login container-registry.oracle.com(账号需在 oracle.com 注册并接受许可协议)registry.cn-hangzhou.aliyuncs.com/zhuyijun/oracle:19c,但仅限开发测试,不满足等保或金融合规场景Oracle 容器内以 oracle 用户运行初始化脚本,它没有 sudo 权限,也不能递归创建父目录。权限不足或路径错误会导致静默失败,日志里只显示:mkdir: cannot create directory ‘/opt/oracle/oradata’: Permission denied 或 cat: /opt/oracle/cfgtoollogs/dbca/ORCL.log: No such file or directory。
sudo mkdir -p /mydata/oracle/oradata && sudo chmod 777 /mydata/oracle/oradata
-v /mydata/oracle/oradata:/opt/oracle/oradata
./oradata、~/oradata、/home/user/oradata 全部不行——哪怕后者是绝对路径,也可能因用户 umask 限制导致子目录不可写看似合法的密码如 ORACLE_PWD=oracle@2026 或 ORACLE_PWD=Orcl2026!,在 bash 中会被展开:! 触发历史命令扩展,$、`、" 也会被插值,最终传进容器的密码被截断,数据库创建失败。
ORACLE_PWD=Orcl2026
-e 'ORACLE_PWD=oracle@2026'
! @ $ % ^ & * ( ) ` " ' | ; : , . ? / 中任意字符(即使加了引号,某些 shell 或 CI 环境仍可能二次解析)别一看到 docker ps 显示 running 就去连——Oracle 初始化要好几分钟,期间连上去会报 ORA-12514: TNS:listener does not currently know of service requested。必须等容器日志输出明确字符串:
DATABASE IS READY TO USE!
docker logs -f oracle19c
sqlplus system/Orcl2026@//localhost:1521/ORCLPDB1
docker logs oracle19c | tail -50 查错,别盲目重启真正容易被忽略的是:容器启动成功 ≠ 数据库就绪。很多团队在 CI 流水线里没加就绪检查,导致后续 SQL 脚本批量失败,排查时才发现是连早了两分钟。