Oracle &引用;sqlplus";:在$PATH中找不到可执行文件;使用docker exec运行命令时

Oracle &引用;sqlplus";:在$PATH中找不到可执行文件;使用docker exec运行命令时,oracle,docker,Oracle,Docker,我想用OracleXE启动一个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 执行脚本: ro

我想用OracleXE启动一个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
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
使用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
但是,我希望在之后退出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"
我得到了一个错误:

OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"sqlplus\": executable file not found in $PATH": unknown
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
初始化SQL*Plus时出现错误6 SP2-0667:未找到消息文件sp1.msb SP2-0750:您可能需要将ORACLE_HOME设置为您的ORACLE软件目录
sqlplus
bin位置添加到.bashrc中的路径中,请参见:

如果不调用
bash
而直接运行exec,它将尝试使用
sh-c
运行命令,并且不会加载.bashrc。尝试运行此命令以直接运行文件:

docker exec db /u01/app/oracle/product/11.2.0/xe/bin/sqlplus system/oracle@xe @/home/vpk/ddl.sql
我还认为使用
bash-c“command”
运行时可能会加载.bashrc,但它似乎没有,我可能想了解bash是如何加载.bashrc文件的

编辑:

如以下注释所述,未设置ORACLE_HOME。此命令应在以下情况下工作:

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"

我知道这对我来说可能有点“愚蠢”,但请记住要留出时间让实例完成实例化。12c企业版,第页。例如,完全实例化和创建供使用的数据库大约需要10分钟

在本地下载Oracle instant client(包括sqlplus)并访问容器中的数据库。@KaushikNayak我想在shell脚本中完成所有操作,而不需要任何安装。如前3个命令所示,可以创建数据库。因此不需要其他工具。您的容器是否安装了sql plus?路径包括sql plus。您可以尝试echo$PATH或哪个sqlplus来确认它存在于容器中。
SP2-0750
表示
oraenv
脚本不是“源代码的”——它通常在.profile/.bash\u profile中完成;它根据某些环境变量设置ORACLE_HOME、ORACLE_SID、PATH和其他。请参阅编辑的问题。我刚把执行结果放进去。一定有一些根本问题。可能是错误的用户。。。这就是为什么“sqlplus”和其他文件不被“看到”的原因。嗯,这是相当详细的,但它是有效的:
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系统/oracle@xe/home/vpk/ddl.sql“
source/etc/bash.bashrc
也应该可以工作,但是我似乎无法让它在sessionmaxm命令运行期间设置正确的环境变量。但是我想在之后退出sqplus提示符。我已经编辑了我的问题。请看最后的命令。嗯,我想如果你从命令中删除
-it
,SQL不会生成shell,命令会退出。