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

如何通过Python脚本实现Docker容器间文件传输?

可行实现方案

完全可以通过Python脚本实现两个Docker容器间的文件传输,常用的落地方案有3种,按生产环境推荐优先级从高到低排列:

  • 共享存储卷传输
    这是性能最高、最稳定的方案:给容器A和容器B挂载同一个Docker命名卷或者宿主机共享目录,两个容器内的应用都可以直接访问这个卷对应的挂载路径。Python脚本不需要额外依赖,直接做普通的文件读写操作就能完成传输。
    容器A侧发送文件的示例代码:
    from pathlib import Path
    # 提前在两个容器中配置好的共享卷挂载路径
    SHARE_MOUNT_PATH = Path("/app/restore_share")
    SHARE_MOUNT_PATH.mkdir(exist_ok=True, parents=True)
    
    def transfer_to_b(source_file: Path):
        target = SHARE_MOUNT_PATH / f"restore_{source_file.name}"
        target.write_bytes(source_file.read_bytes())
        # 额外写标记文件,通知B文件传输完成,避免B读到半写的损坏文件
        (SHARE_MOUNT_PATH / f"{target.name}.done").touch()
    
    容器B侧只需要轮询共享目录下的.done标记文件,检测到标记存在后再读取对应文件即可。
  • 同网络HTTP接口传输
    如果不方便挂载共享卷,可以把两个容器加入同一个Docker自定义网络,在容器B中用Python起一个轻量的文件接收接口,容器A直接通过容器名作为访问地址,调用接口上传文件。这种方式不需要修改容器的挂载配置,适合临时传输的场景。
    容器B侧如果不想装第三方依赖,可以直接用Python标准库实现最简接收服务:
    from http.server import BaseHTTPRequestHandler, HTTPServer
    import cgi
    
    class FileReceiveHandler(BaseHTTPRequestHandler):
        def do_POST(self):
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type']}
            )
            file_item = form['restore_file']
            with open(f"/app/restore_input/{file_item.filename}", 'wb') as f:
                f.write(file_item.file.read())
            self.send_response(200)
            self.end_headers()
            self.wfile.write(b"file received")
    
    if __name__ == "__main__":
        server = HTTPServer(("0.0.0.0", 8000), FileReceiveHandler)
        server.serve_forever()
    
    容器A侧同样可以用标准库发POST请求上传文件,不需要额外安装依赖。注意不要把这个接收端口映射到宿主机公网,只在Docker内网开放即可。
  • Docker SDK直连拷贝
    如果脚本所在容器挂载了宿主机的/var/run/docker.sock,可以通过Docker官方的Python SDK直接调用Docker API,在容器间拷贝文件。但这种方案会让业务容器拿到整个Docker宿主机的控制权限,安全风险极高,除非是测试环境临时用,否则绝对不推荐生产环境使用。
实现思路合理性判断

这个思路本身不存在本质问题,要不要用完全取决于你的业务场景:

  • 适用的合理场景:两个容器属于同一个业务编排栈(比如同一个docker-compose管理的关联服务),传输的是数据恢复所需的备份、快照类非实时大文件,用共享卷或者内网加密HTTP传输的方式是非常常规的生产实践,稳定性和可维护性都有保障。
  • 不推荐使用的场景:
    • 两个容器分属完全独立的业务域,没有强绑定关系,点对点文件传输会打破业务边界,后续迭代、迁移时很容易出现隐式依赖导致的故障,这种情况建议走统一的内部文件存储服务做中转。
    • 传输内容包含密钥、用户敏感信息时,禁止用明文HTTP传输,也禁止为了传文件给业务容器开放docker.sock权限,前者存在内网窃听风险,后者会直接导致容器逃逸风险。
    • 传输文件单个体量超过10G时,不推荐用HTTP接口传输,内存和网络开销过大,很容易触发OOM或者超时问题,优先选共享卷方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:54:35