在使用docker exec命令运行一个命令时,出现"sqlplus: executable file not found in $PATH"的错误提示。

3

我想启动一个带有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

I got the error:

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),并访问容器中的数据库。 - Kaushik Nayak
我想在一个shell脚本中完成所有操作,不需要任何安装。如前三个命令所示,可以创建数据库,因此不需要额外的工具。 - ka3ak
你的容器是否安装了Sqlplus? 并且路径中包含Sqlplus。您可以尝试使用echo $PATH或which sqlplus确认其是否存在于容器中。 - Andy Wong
"SP2-0750" 表示 "oraenv" 脚本未被 "sourced" -- 通常在 .profile/.bash_profile 中完成;它根据某些环境变量设置 ORACLE_HOME、ORACLE_SID、PATH 和其他内容。 - Mark Stewart
2个回答

4

sqlplus二进制文件的位置已经在.bashrc文件中添加到了PATH环境变量中,可以查看setup文件的第28行。

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"

请查看已编辑的问题。我刚刚放置了执行结果。必须有一些根本性的问题。可能是错误的用户...这就是为什么“sqlplus”和其他文件没有被“看到”的原因。 - ka3ak
1
这个有点冗长,但是能用: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" - maxm
source /etc/bash.bashrc 应该也可以工作,但是我似乎无法在会话期间设置正确的环境变量。 - maxm
您的命令有效。但我想在sqplus提示符后退出。我已经编辑了我的问题。请看那里的最后几个命令。 - ka3ak
1
嗯,我认为如果你只是从命令中删除“-it”,SQL就不会生成一个shell,而且命令将会退出。 - maxm
最大值,谢谢。请发表你的答案,我会接受它。 - ka3ak

0

我知道这可能听起来有点“傻”,但请记得给实例完成实例化的时间。例如,12c企业版需要大约10分钟才能完全实例化并创建可用于使用的数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接