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
相关产品推荐
相关产品推荐

