Docker容器内执行ISQL脚本时参数传递失败的问题求助
解决Docker Exec调用Virtuoso ISQL执行脚本的参数问题
问题描述
尝试通过docker exec调用容器内的Virtuoso交互式SQL工具(isql)执行脚本,直接执行以下命令时,isql启动但参数混乱,无法正常执行脚本:
docker exec -it virtuoso ../bin/isql $HOSTNAME dba dba ./rdf_inputs/insert_my_stff.isql
改用sh -c包裹命令后依然无效:
docker exec -it virtuoso sh -c "../bin/isql $HOSTNAME dba dba ./rdf_inputs/insert_my_stff.isql"
但手动进入容器后执行相同命令却完全正常:
../bin/isql $HOSTNAME dba dba ./rdf_inputs/insert_my_stff.isql
原因分析
- 变量解析冲突:用双引号包裹
sh -c命令时,$HOSTNAME会被宿主机Shell提前解析,而非容器内部Shell处理,导致传递给isql的是宿主机的主机名,不符合容器内的执行要求。 - 相对路径依赖差异:
docker exec默认使用容器的预设工作目录(WORKDIR),若手动进入容器时的工作目录与该默认目录不同,../bin/isql、./rdf_inputs/...这类相对路径会指向错误位置。
解决方案
方案1:用单引号隔离变量解析
将sh -c后的命令用单引号包裹,确保变量在容器内部Shell中解析:
docker exec -it virtuoso sh -c '../bin/isql $HOSTNAME dba dba ./rdf_inputs/insert_my_stff.isql'
方案2:使用绝对路径避免路径问题
直接使用isql和脚本文件的绝对路径,消除工作目录差异带来的影响:
docker exec -it virtuoso /absolute/path/to/bin/isql $HOSTNAME dba dba /absolute/path/to/rdf_inputs/insert_my_stff.isql
(替换/absolute/path/to/为容器内实际的路径)
方案3:指定容器内工作目录
通过-w参数设置docker exec的工作目录,与手动进入容器时的目录保持一致:
docker exec -it -w /your/manual/working/dir virtuoso ../bin/isql $HOSTNAME dba dba ./rdf_inputs/insert_my_stff.isql
(替换/your/manual/working/dir为手动进入容器时的当前工作目录)
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

