【发布时间】:2020-07-22 01:52:09
【问题描述】:
我想用 Oracle XE 启动一个 Docker 容器,然后运行一个 SQL 脚本 (ddl.sql) 来创建一些表。
如果我分别执行所有步骤,一切正常:
$ docker run -d --name db --rm -p 49161:1521 -v "C:/data/workspace/vpk/":/home/vpk -e ORACLE_ALLOW_REMOTE=true wnameless/oracle-xe-11g
在容器中运行终端:
$ docker exec -it db bash
执行脚本:
root@f3ae34d554af:/# echo exit | sqlplus system/oracle@xe @/home/vpk/ddl.sql
但是,当我尝试将最后两个步骤合二为一时:
$ docker exec db sqlplus system/oracle@xe @/home/vpk/ddl.sql
我得到了错误:
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"sqlplus\": executable file not found in $PATH": unknown
使用 sqlplus 的完整路径也无济于事:
$ docker exec db bash -c "/u01/app/oracle/product/11.2.0/xe/bin/sqlplus system/oracle@xe /home/vpk/ddl.sql"
Error 6 initializing SQL*Plus
SP2-0667: Message file sp1<lang>.msb not found
SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory
错误的原因是什么?
在@maxm 的帮助下,我能够成功运行:
docker exec -it db /bin/bash -c "ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe /u01/app/oracle/product/11.2.0/xe/bin/sqlplus system/oracle@xe @/home/vpk/ddl.sql"
但是我想在之后退出 sqlplus 提示符。但是当我尝试将echo exit 添加到它并运行时:
docker exec -it db /bin/bash -c "ORACLE_HOME=/u01/app/oracle/product/11.2.0/xe; echo exit | /u01/app/oracle/product/11.2.0/xe/bin/sqlplus system/oracle@xe @/home/vpk/ddl.sql"
我得到了错误:
Error 6 initializing SQL*Plus
SP2-0667: Message file sp1<lang>.msb not found
SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory
【问题讨论】:
-
在本地下载Oracle即时客户端(包括sqlplus)并访问容器中的数据库。
-
@KaushikNayak 我想在没有任何安装的情况下在 shell 脚本中执行所有操作。如前 3 个命令所示,可以创建数据库。所以不需要额外的工具。
-
你的容器安装了sql plus吗?并且路径包括sql plus。您可以尝试 echo $PATH 或 which sqlplus 来确认它是否存在于容器中。
-
SP2-0750表示oraenv脚本不是“来源”的——它通常在 .profile/.bash_profile 中完成;它根据某些环境变量设置 ORACLE_HOME、ORACLE_SID、PATH 等。