【问题标题】:"sqlplus": executable file not found in $PATH" when running a command with docker exec“sqlplus”:使用 docker exec 运行命令时在 $PATH 中找不到可执行文件
【发布时间】: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 等。

标签: oracle docker


【解决方案1】:

sqlplus bin 位置已添加到 .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"

【讨论】:

  • 请参阅已编辑的问题。我刚刚放了执行结果。一定有一些根本问题。可能是错误的用户...这就是为什么“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 system/oracle@xe /home/vpk/ddl.sql"
  • source /etc/bash.bashrc 也应该可以工作,但我似乎无法在会话期间设置正确的环境变量
  • maxm 你的命令有效。但我想之后退出 sqplus 提示。我已经编辑了我的问题。请查看最后的命令。
  • 嗯,我认为如果你只是从命令中删除 -it,SQL 将不会生成 shell,命令将退出。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多