You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:基于同一Docker镜像创建独立并发容器用于PHPUnit测试

解决方案:创建独立的并发Docker容器组用于PHPUnit测试

核心结论

完全可以创建最多5个完全独立、无通信的容器组(PHP+MySQL),用于并行运行PHPUnit测试,测试完成后自动销毁实例。

先解决当前的MySQL连接错误(ERROR 1130)

这个错误是因为MySQL默认只允许localhost连接,你的PHP容器从其他IP访问时,需要授权用户允许远程访问:

  1. 在你的SQL初始化脚本init.sql中添加以下内容,创建允许任意IP访问的测试用户:
CREATE USER 'testuser'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'%';
FLUSH PRIVILEGES;
  1. 确保PHP容器连接MySQL时使用这个授权用户,而非仅允许localhost的用户。

架构优化:用Docker Compose项目隔离实现多实例

手动创建php-2、mysql-2这类命名容器会导致管理复杂,推荐用Docker Compose的项目隔离(-p参数)来批量创建独立实例:

1. 编写通用的docker-compose.yml

version: '3.8'
services:
  php:
    build: ./php  # 指向你的PHP镜像构建目录
    volumes:
      - ./your-tests:/var/www/tests  # 挂载本地测试代码到容器内
    depends_on:
      - mysql
    command: ["phpunit", "/var/www/tests"]  # 启动后直接运行测试
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: test_root_pass
      MYSQL_DATABASE: test_db
      MYSQL_USER: testuser
      MYSQL_PASSWORD: test_pass
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql  # 挂载初始化脚本
      - type: tmpfs  # 使用临时存储,容器销毁后数据自动清除
        target: /var/lib/mysql

2. 启动多个独立实例

每个实例通过-p <项目名>参数隔离,自动创建独立的网络、容器名和资源:

# 启动第1个实例
docker-compose -p test1 up --abort-on-container-exit --remove-orphans

# 启动第2个实例(可同时运行)
docker-compose -p test2 up --abort-on-container-exit --remove-orphans

# 最多可以启动5个,依次用test3到test5作为项目名
  • --abort-on-container-exit:PHPUnit测试完成后自动停止容器
  • --remove-orphans:清理无关的孤立容器
  • 临时卷tmpfs:确保测试数据不会持久化,销毁容器即清空数据库

3. 批量并行启动(可选)

如果需要同时启动5个实例,写个简单的bash脚本:

#!/bin/bash
# 并行启动5个测试实例
for i in {1..5}; do
  docker-compose -p test$i up --abort-on-container-exit --remove-orphans &
done
# 等待所有实例完成
wait

额外优化建议

  • 资源限制:避免单个实例占用过多资源,在docker-compose.yml中添加资源限制:
services:
  php:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
  mysql:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
  • 单容器方案(可选):如果不需要拆分PHP和MySQL,可以把两者打包到同一个镜像,用supervisord管理两个进程,每个容器就是一个独立测试单元,减少容器间通信的复杂度。

内容的提问来源于stack exchange,提问作者chugged

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:40:32