You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原因分析

  1. 变量解析冲突:用双引号包裹sh -c命令时,$HOSTNAME会被宿主机Shell提前解析,而非容器内部Shell处理,导致传递给isql的是宿主机的主机名,不符合容器内的执行要求。
  2. 相对路径依赖差异: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:18:19