Docker化FastAPI项目:能否直接从MySQL BLOB取CV用于Selenium自动投递
解决方案:无需文件服务器/主机存储,直接从数据库读取BLOB处理
不用折腾文件服务器或者把文件存到Docker主机,直接从数据库读BLOB数据,在容器内部生成临时文件给Selenium用就行,用完就删,全程闭环在容器里。
具体实现步骤
1. 从MySQL读取BLOB格式的CV数据
在FastAPI代码里直接查询数据库,拿到CV的字节数据和对应的文件名(建议把文件名也存在数据库里,方便后续生成临时文件时保持格式一致):
import mysql.connector from mysql.connector import Error def fetch_cv_from_db(user_id): try: # 注意这里的host填Docker Compose里的MySQL服务名 conn = mysql.connector.connect(host="mysql", database="your_db_name", user="db_user", password="db_pass") cursor = conn.cursor() # 假设表结构里cv_blob存二进制数据,filename存文件名 query = "SELECT cv_blob, filename FROM user_cvs WHERE user_id = %s" cursor.execute(query, (user_id,)) result = cursor.fetchone() return (result[0], result[1]) if result else (None, None) except Error as e: print(f"数据库读取失败: {e}") return (None, None) finally: if conn.is_connected(): cursor.close() conn.close()
2. 在容器内生成临时文件供Selenium使用
用Python的tempfile模块在容器内部创建临时文件,把BLOB字节写入进去——这个文件只存在于容器的临时目录,不会写到Docker主机,用完直接删除:
import tempfile import os from selenium import webdriver from selenium.webdriver.common.by import By def auto_apply_with_cv(cv_blob, filename): # 生成和原CV同后缀的临时文件,delete=False确保写入后不被立即删除 with tempfile.NamedTemporaryFile(suffix=f".{filename.split('.')[-1]}", delete=False) as temp_f: temp_f.write(cv_blob) temp_path = temp_f.name try: # 初始化Chrome(适配Docker环境的配置) chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") driver = webdriver.Chrome(options=chrome_options) # 打开jobserve的职位投递页面 driver.get("https://www.jobserve.com/your-apply-url") # 定位文件上传输入框,传入临时文件路径 upload_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']") upload_input.send_keys(temp_path) # 后续完成投递的其他操作(填写表单、提交等) # ... finally: # 清理资源:关闭浏览器+删除临时文件 driver.quit() os.unlink(temp_path)
3. Docker环境适配要点
- 如果你是用Docker Compose部署,推荐把Selenium单独做成一个服务(比如用官方
selenium/standalone-chrome镜像),FastAPI容器通过网络访问Selenium服务,避免在FastAPI容器里安装Chrome的繁琐配置。 - 不需要给容器挂载任何主机目录,临时文件默认存在容器的
/tmp目录,容器重启后会自动清理。
为什么不选文件服务器?
- 增加不必要的复杂度:额外维护文件服务器会提升部署和运维成本。
- 避免数据不一致:CV存在数据库里,直接读取能保证文件和数据库记录的一致性。
- 减少安全风险:不需要开放文件存储的访问权限,降低攻击面。
内容的提问来源于stack exchange,提问作者OLUYELE SUNDAY ANTHONY
相关产品推荐
相关产品推荐

