如何在Django项目Docker容器中通过chromedriver正确保存文件到指定目录
问题核心原因
- 你使用的是远程独立Chrome容器,
download.default_directory配置的是Chrome容器内部的绝对路径,而非Django容器的本地路径,两边路径如果没有对应一致就会写入失败 - 旧版无头Chrome模式默认不支持自定义下载目录,权限配置缺失也会导致写入被禁止
分步解决方案
1. 修正下载路径配置
你Docker Compose中已经将共享卷media挂载到Chrome容器的/app/media路径,直接给Chrome传递容器内的绝对路径即可,不要使用Django侧的settings.MEDIA_ROOT拼接(除非两边容器的MEDIA_ROOT路径完全一致):
# 直接写Chrome容器内的目标路径 download_dir = "/app/media/uploads"
2. 补充Chrome启动参数与配置
替换旧版无头模式配置,补充必要的权限参数,完善prefs配置:
options = webdriver.ChromeOptions() # 替换旧版无头模式为新版无头,避免下载限制 options.add_argument("--headless=new") options.add_argument("--no-sandbox") options.add_argument("--disable-dev-shm-usage") # User Agent options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84') # Disable driver mode options.add_argument('--disable-blink-features=AutomationControlled') # Download settings download_dir = "/app/media/uploads" prefs = { 'download.default_directory': download_dir, 'download.prompt_for_download': False, 'download.directory_upgrade': True, 'safebrowsing_for_trusted_sources_enabled': False, 'safebrowsing.enabled': False, # 禁止弹窗拦截下载 'profile.default_content_settings.popups': 0, # 允许自动下载多文件 'profile.default_content_setting_values.automatic_downloads': 1 } options.add_experimental_option('prefs', prefs) driver = webdriver.Remote("http://chrome:4444/wd/hub", options=options)
3. 修复目录权限问题
selenium/standalone-chrome默认使用uid为1200的selenium用户运行,需要保证目标目录有写入权限:
- 进入Chrome容器验证权限:
docker exec -it Chrome-selenium bash - 执行测试写入:
sudo -u selenium touch /app/media/uploads/test.txt
如果提示权限不足,执行以下命令修改目录权限(可在Django容器或者宿主机挂载的对应目录执行):
chown -R 1200:1200 /app/media/uploads chmod -R 775 /app/media/uploads
4. 排查文件实际存储位置
如果还是找不到下载文件,可以通过以下代码读取Chrome的下载记录,获取实际写入路径:
# 触发下载后执行 driver.get("chrome://downloads/") download_items = driver.execute_script("return downloads.Manager.get().items_") for item in download_items: print(f"下载文件路径:{item.get('filePath')}")
内容的提问来源于stack exchange,提问作者Razilator
相关产品推荐
相关产品推荐

