如何在Docker Compose/K8s中部署MageAI并解决Selenium启动失败问题
可行部署方案
Docker Compose 方案
思路
将MageAI与Selenium Chrome服务拆分为两个独立容器,通过内部网络互通:MageAI容器仅负责ETL逻辑执行,Selenium容器单独提供浏览器运行环境,彻底规避在Mage容器内安装浏览器及驱动引发的依赖冲突问题。
具体配置
- 创建
docker-compose.yml文件:
version: '3.8' services: mage: image: mageai/mageai:latest command: mage start my_project ports: - "6789:6789" volumes: - ./my_project:/home/src/my_project environment: - SELENIUM_REMOTE_URL=http://selenium-chrome:4444/wd/hub depends_on: - selenium-chrome selenium-chrome: image: selenium/standalone-chrome:latest ports: - "4444:4444" - "7900:7900" # VNC端口,用于调试浏览器运行状态 shm_size: '2g' # 解决Chrome内存不足导致的崩溃问题
- 修改MageAI中的Selenium代码:
放弃本地启动ChromeDriver,改为连接远程Selenium服务:
import os from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() chrome_options.add_argument("--headless=new") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") # 读取环境变量中的远程服务地址 driver = webdriver.Remote( command_executor=os.getenv("SELENIUM_REMOTE_URL"), options=chrome_options ) # 后续爬取逻辑保持不变 driver.get("https://target-website.com") # ... 执行元素定位、数据提取等操作 driver.quit()
- 启动服务:
docker-compose up -d
Kubernetes 方案
思路
延续服务分离模式,通过Kubernetes的Service实现服务发现,确保MagePod能稳定访问Selenium Chrome服务,同时利用K8s的自愈能力提升整体架构稳定性。
具体配置
- Selenium Chrome Deployment 与 Service:
apiVersion: apps/v1 kind: Deployment metadata: name: selenium-chrome spec: replicas: 1 selector: matchLabels: app: selenium-chrome template: metadata: labels: app: selenium-chrome spec: containers: - name: selenium-chrome image: selenium/standalone-chrome:latest resources: requests: memory: "2Gi" cpu: "1" limits: memory: "2Gi" cpu: "1" ports: - containerPort: 4444 volumeMounts: - mountPath: /dev/shm name: dshm volumes: - name: dshm emptyDir: medium: Memory --- apiVersion: v1 kind: Service metadata: name: selenium-chrome-service spec: selector: app: selenium-chrome ports: - protocol: TCP port: 4444 targetPort: 4444
- MageAI Deployment(配置环境变量指向Selenium服务):
apiVersion: apps/v1 kind: Deployment metadata: name: mageai spec: replicas: 1 selector: matchLabels: app: mageai template: metadata: labels: app: mageai spec: containers: - name: mageai image: mageai/mageai:latest command: ["mage", "start", "my_project"] ports: - containerPort: 6789 env: - name: SELENIUM_REMOTE_URL value: "http://selenium-chrome-service:4444/wd/hub" volumeMounts: - name: mage-project mountPath: /home/src/my_project volumes: - name: mage-project persistentVolumeClaim: claimName: mage-project-pvc
- 调整MageAI中的Selenium代码(与Docker Compose方案一致,使用远程连接)。
关键注意事项
- 两种部署方式都需为Selenium容器分配至少2G内存,并配置
/dev/shm内存挂载,避免Chrome因内存不足崩溃。 - 远程连接时,Docker Compose通过服务名直接访问,Kubernetes通过Service名称访问,确保网络可达。
- 调试时可通过Selenium容器的7900端口(VNC)连接,默认密码为
secret,查看浏览器实时运行状态。
内容的提问来源于stack exchange,提问作者Kamarul Adha
相关产品推荐
相关产品推荐

