Docker容器内调用Python Docker Client报错:绑定源路径不存在
问题原因
你遇到的核心问题是:Docker Client是和宿主机的Docker daemon通信的,bind mount的source路径必须是宿主机上存在的路径。
你在容器内的/code目录下创建了User_Input.json,这个文件只存在于当前运行的Python容器内部,宿主机上根本没有/code/User_Input.json这个路径,所以宿主机的Docker daemon找不到它,抛出"bind source path does not exist"的错误。而本地运行脚本时,你的cwd是宿主机的真实路径,daemon能直接访问,所以一切正常。
解决方案
1. 运行Python容器时,挂载宿主机目录+Docker Socket
首先,确保运行你的Python容器时,做两个挂载:
- 挂载宿主机的Docker Socket,让容器内的Docker Client能和宿主机daemon通信:
-v /var/run/docker.sock:/var/run/docker.sock - 挂载一个宿主机的本地目录到容器内,用于存放需要共享给新容器的文件:比如
-v $(pwd)/host-shared:/host-shared($(pwd)是宿主机当前目录,/host-shared是容器内的映射路径)
完整运行命令示例:
docker run -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd)/host-shared:/host-shared your-python-image-name
2. 修改Python脚本的文件路径和挂载配置
把脚本中创建文件、挂载的路径都换成容器内的挂载目录(对应宿主机的真实路径),确保Docker daemon能找到:
client.images.pull(docker_image) # 替换为容器内的挂载目录,对应宿主机的$(pwd)/host-shared shared_dir = "/host-shared" # 在共享目录创建User_Input.json with open(f"{shared_dir}/User_Input.json", "w") as f: json.dump(user_input, f) # 挂载共享目录到新容器的/home/hostcwd volumes = {shared_dir: {"bind": "/home/hostcwd", "mode": "rw"}} # 挂载文件的source用共享目录下的路径(宿主机上存在) mounts = [ docker.types.Mount( type="bind", source=f"{shared_dir}/User_Input.json", target="/User_Input.json", read_only=False ) ] container = client.containers.run( docker_image, command=None, volumes=volumes, environment=env_vars, mounts=mounts, stdin_open=True, stdout=True, stderr=True, remove=True, tty=True, detach=True, ) for line in container.logs(stream=True): print(line.decode("utf-8"), end="")
3. 验证逻辑
- 运行Python容器后,脚本会在
/host-shared(对应宿主机的$(pwd)/host-shared)创建User_Input.json - 当调用Docker Client创建新容器时,
source路径指向的是宿主机的$(pwd)/host-shared/User_Input.json,daemon能正常找到这个文件,挂载成功
内容的提问来源于stack exchange,提问作者Riley Hun
相关产品推荐
相关产品推荐

