如何通过Python脚本实现Docker容器间文件传输?
可行实现方案
完全可以通过Python脚本实现两个Docker容器间的文件传输,常用的落地方案有3种,按生产环境推荐优先级从高到低排列:
- 共享存储卷传输
这是性能最高、最稳定的方案:给容器A和容器B挂载同一个Docker命名卷或者宿主机共享目录,两个容器内的应用都可以直接访问这个卷对应的挂载路径。Python脚本不需要额外依赖,直接做普通的文件读写操作就能完成传输。
容器A侧发送文件的示例代码:
容器B侧只需要轮询共享目录下的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().done标记文件,检测到标记存在后再读取对应文件即可。 - 同网络HTTP接口传输
如果不方便挂载共享卷,可以把两个容器加入同一个Docker自定义网络,在容器B中用Python起一个轻量的文件接收接口,容器A直接通过容器名作为访问地址,调用接口上传文件。这种方式不需要修改容器的挂载配置,适合临时传输的场景。
容器B侧如果不想装第三方依赖,可以直接用Python标准库实现最简接收服务:
容器A侧同样可以用标准库发POST请求上传文件,不需要额外安装依赖。注意不要把这个接收端口映射到宿主机公网,只在Docker内网开放即可。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() - 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
相关产品推荐
相关产品推荐

