使用Deno.run()执行docker命令时对cmd参数组成的疑问
Deno调用docker命令报错解决方案
Deno.run的cmd参数要求传入的数组中每一项对应执行程序的一个独立参数,它不会自动将包含空格的字符串拆分为多个参数。你之前的写法将多个参数合并为单个字符串传入,会被docker识别为无效的单参数,因此抛出未知命令的报错。
方案1:手动拆分所有参数(推荐)
这种写法没有shell注入风险,性能更好:
const VOLUME = "pgdata"; const PASSWORD = "123456"; function runCmd(s: string[]): Deno.Process { return Deno.run({ cmd: s, stdout: "piped", stderr: "piped" }) } function runPg() { const cmd = [ "docker", "run", "-d", "-v", `${VOLUME}:/var/lib/postgresql/data`, "--name", "pg", "-e", `POSTGRES_PASSWORD=${PASSWORD}`, "--rm", "-p", "5432:5432", "postgres" ]; return runCmd(cmd); }
方案2:通过shell执行(适合复杂命令)
如果你不想手动拆分参数,可以调用shell来解析整段命令,注意如果VOLUME、PASSWORD变量来自不可信输入,会存在shell注入风险:
function runPg() { const cmd = [ "sh", "-c", `docker run -d -v ${VOLUME}:/var/lib/postgresql/data --name pg -e POSTGRES_PASSWORD=${PASSWORD} --rm -p 5432:5432 postgres` ]; return runCmd(cmd); }
内容的提问来源于stack exchange,提问作者Bing-hsu Gao
相关产品推荐
相关产品推荐

