使用Python Docker SDK将生成的Git补丁写入容器内文件时Here-Documents报错的问题求助
使用Python Docker SDK将生成的Git补丁写入容器内文件时Here-Documents报错的问题求助
问题描述
我现在碰到个棘手的问题:用Python生成Git补丁后,想把补丁数据持久化到Docker容器内的changes.patch文件里,后续好应用补丁、提交变更。我的使用场景是让AI Agent自动挑选代码块(hunks)并迭代处理成提交,所以没法用Git内置的交互式命令(比如git add -p)——这些命令会在终端里挂起等待输入,不符合我的自动化需求。
为了把生成的diff写入补丁文件,我尝试用Here-Documents的方式实现,但一直报错。我的相关代码片段如下:
command = '/bin/bash -c "{command_to_execute}"' # 需要给命令加引号才能在容器里正确执行 update_patch_file_command = command.format(command=f"cat > {file} <<EOL\n{data}\nEOL") err_code, output = self.container.exec_run( update_patch_file_command, privileged=False, workdir=self.repository_work_dir )
我准备了一个最小复现示例,数据是:
data = 'tion("Could not construct input object: missing field \'${it.name}\' in \'${graphQLType.name}\' ")'
运行后生成的update_patch_file_command字符串是:
"/bin/bash -c "cat > all_changes.patch <<EOL tion("Could not construct input object: missing field '\\${it.name}' in '\\${graphQLType.name}' ") EOL""
但container.exec_run返回了报错信息:
b"not: line 2: warning: here-document at line 1 delimited by end-of-file (wanted EOL')\n"
我特意确认过,EOL前面没有任何空格(直接从调试器里复制的),但还是出现了这个错误,实在搞不懂哪里出问题了。
我已经尝试过的方法
针对当前的报错,我试过以下几种方案,但都没解决问题:
- 用
echo写入:不行,因为我的字符串是多行的,echo处理不了 - 不给bash调用里的
command加双引号:命令完全无法执行 - 输出到一个还不存在的文件里
- 给
container.exec_run启用更高权限 - 用
>|强制覆盖文件 - 用
shlex.quote处理命令:还是报同样的错误,而且我觉得这个用法是安全的 - 用
tee代替cat来写入文件
另外还有一些和整体目标相关的思路(给大家额外提供上下文,看看有没有其他方向):
- 可以用Python Docker SDK的
put_archive函数把文件复制进容器,但感觉这个方法很繁琐,扩展性也不好,所以想找更优雅的方案 - 尝试给容器开启
tty并打开stdin,但还是没法直接用Git的交互式功能(比如前面说的git add -p)
编辑1:我刚想到或许可以把代码块提取逻辑写到shell脚本里,完全避开Python和Docker的交互问题,不过还没尝试。
编辑2:把示例改成了更简单的情况,方便复现问题。
备注:内容来源于stack exchange,提问作者Liqs
相关产品推荐
相关产品推荐

