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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:03:03