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

Bash脚本中向Docker命令传递变量失败,如何解决?

问题分析与解决思路

你遇到的核心问题是单引号阻止了Bash变量的展开,导致容器内的shell无法获取到start和end的实际值,最终Python脚本接收到的是空字符串。下面给你两种可行的解决方法,以及背后的原理:

方案一:替换单引号为双引号(最简单直接)

把Docker命令里包裹python命令的单引号改成双引号,这样Bash会先将${start}和${end}替换成实际的日期值,再把完整的命令传递给容器内的shell执行:

#!/bin/bash
start=$(date -d '13 hours ago' '+%Y-%m-%d %H')
end=$(date -d '12 hours ago' '+%Y-%m-%d %H')
docker run --rm -v /home/basic/buffer/:/home psycopg2 /bin/sh -c "python /home/config.py ${start} ${end}" > /home/basic/result

方案二:通过环境变量传递参数(更安全,适合复杂场景)

如果你的参数里包含空格、特殊字符,或者担心直接拼接命令带来的注入风险,推荐用环境变量的方式传递:

修改Bash脚本

#!/bin/bash
start=$(date -d '13 hours ago' '+%Y-%m-%d %H')
end=$(date -d '12 hours ago' '+%Y-%m-%d %H')
docker run --rm -v /home/basic/buffer/:/home -e START_TIME="${start}" -e END_TIME="${end}" psycopg2 /bin/sh -c 'python /home/config.py' > /home/basic/result

修改Python脚本(config.py)

import psycopg2
import datetime
import os

start = os.environ.get('START_TIME', '')
end = os.environ.get('END_TIME', '')
print("start:", start)
print("end:", end)

为什么原来的写法会失败?

在Bash语法中,单引号内的所有内容都会被当作纯字面量处理,不会进行变量替换、命令解析等操作。你原来的命令里,${start}和${end}并没有被替换成你定义的日期值,而是直接传递给了容器内的sh。但容器内的shell环境中并没有定义这两个变量,所以它们会被解析为空字符串,最终Python脚本通过sys.argv拿到的就是空值。

另外提个小细节:你原来的命令里${start}后面多了一个空格,建议去掉,避免产生不必要的空参数。

内容的提问来源于stack exchange,提问作者user7796543

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:43:11