我想使用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
答案 0 :(得分:3)
sqlplus
箱位置已添加到.bashrc中的PATH中,请参见setup中的这一行:
echo 'export PATH=$ORACLE_HOME/bin:$PATH' >> /etc/bash.bashrc
当直接运行exec而不调用bash
时,它将尝试使用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"
答案 1 :(得分:0)
我知道对我而言,这似乎有些“傻”,但请记住要留出时间来实例化实例。第12c企业版,第9页。例如,大约需要10分钟才能完全实例化并创建要使用的数据库