如何通过Docker Python API正确挂载卷以同步生成文件?
问题分析与修正方案
你使用Docker Python API的create_container方法时,卷挂载的配置逻辑有误,导致文件无法同步到本地。以下是具体问题和解决方法:
核心问题
create_container中的volumes参数仅用于声明容器内需要挂载的路径,而宿主机与容器的路径映射关系,需要通过host_config的binds参数来指定——这才对应docker run -v的映射逻辑。你之前的代码把宿主机路径也放进了volumes列表,这是错误的用法。
修正方案
方案1:修正create_container的配置
container = client.create_container( image='demo', stdin_open=True, tty=False, # 明确指定输出路径为挂载的容器目录,避免因工作目录差异导致文件生成到非挂载区 command="python3 /quantum-demo/circuit.py --res='/quantum-demo/'", volumes=['/quantum-demo/'], # 仅声明容器内的挂载目标路径 detach=True, host_config=client.create_host_config( # 配置宿主机与容器的路径映射,格式与docker run -v完全一致 binds=['/Users/gowthamkrishnaaddluri/Documents/dfki_sse/demo:/quantum-demo/'] ) ) client.start(container=container.get('Id'))
方案2:使用更简洁的containers.run(推荐)
create_container是较旧的API方法,Docker官方更推荐使用containers.run,它的参数逻辑和docker run更一致,更易读且不易出错:
client.containers.run( image='demo', command="python3 /quantum-demo/circuit.py --res='/quantum-demo/'", # 直接通过字典配置卷映射,键为宿主机路径,值指定容器绑定路径和读写权限 volumes={ '/Users/gowthamkrishnaaddluri/Documents/dfki_sse/demo': { 'bind': '/quantum-demo/', 'mode': 'rw' # 读写模式,默认即为rw,可省略 } }, detach=True, stdin_open=True )
额外注意事项
- 确保宿主机目录
/Users/gowthamkrishnaaddluri/Documents/dfki_sse/demo已存在,Docker不会自动创建不存在的宿主机绑定目录。 - 检查容器内运行脚本的用户是否拥有
/quantum-demo/目录的读写权限,如果脚本以非root用户运行,可能需要调整宿主机目录的权限,或在Dockerfile中配置合适的用户权限。
内容的提问来源于stack exchange,提问作者gowtham krishna
相关产品推荐
相关产品推荐

