Mac Docker环境下Laravel的Pest测试运行极慢求助
Laravel Docker化后Pest测试速度骤降的解决思路
问题背景
本地开发Laravel应用时,Pest测试仅需3秒完成,但Docker化后耗时超1分钟。以下是当前的Docker配置:
Dockerfile配置
FROM php:8.1.12-fpm ARG uid=1000 ARG user=macgiver RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip \ unzip # Install and enable xDebug RUN pecl install xdebug \ && docker-php-ext-enable xdebug RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install php modules required by laravel. RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd # Create system user to run Composer and Artisan commands. RUN useradd -G www-data,root -u $uid -d /home/$user $user RUN mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Install composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer # Set working directory WORKDIR /var/www USER $user
docker-compose.yml配置
version: "3.9" services: app: build: context: ./ dockerfile: Dockerfile image: dmc container_name: dmc-app restart: unless-stopped working_dir: /var/www/ depends_on: - db - nginx volumes: - ./:/var/www/ - ./docker/php/conf.d/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini - ./docker/php/conf.d/error_reporting.ini:/usr/local/etc/php/conf.d/error_reporting.ini expose: - "9003" networks: - dmc-net nginx: image: nginx:1.23.2-alpine container_name: dmc-nginx restart: unless-stopped ports: - "8000:80" volumes: - ./:/var/www - ./docker-compose/nginx:/etc/nginx/conf.d networks: - dmc-net db: image: mysql:8.0.31 container_name: dmc-db restart: unless-stopped # using 3307 on the host machine to avoid collisions in case there's a local MySQL instance installed already. ports: - "3307:3306" # use the variables declared in .env file environment: MYSQL_HOST: ${DB_HOST} MYSQL_DATABASE: ${DB_DATABASE} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: abcd1234 MYSQL_USER: ${DB_USERNAME} SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - ./docker-compose/mysql:/docker-entrypoint-initdb.d - mysql-data:/var/lib/mysql networks: - dmc-net networks: dmc-net: driver: bridge volumes: mysql-data:
解决思路
- 关掉Xdebug:Xdebug是调试工具,跑测试时完全不需要,它会严重拖慢PHP执行速度。要么直接在Dockerfile里删掉Xdebug的安装与启用代码,要么测试时临时禁用——比如执行
php -d xdebug.mode=off vendor/bin/pest,或者在xdebug.ini里添加xdebug.mode=off。 - 优化挂载卷性能:本地目录挂载到容器的IO性能在Windows/macOS上本来就差,建议只挂载必要目录,而非整个项目根目录;或者给挂载卷加
cached参数,把app服务的卷配置改成- ./:/var/www:cached,能缓解文件读写慢的问题。 - 换用SQLite跑测试:测试没必要依赖MySQL,Laravel支持切换到内存版SQLite,速度会提升很多。在
.env.testing里配置:DB_CONNECTION=sqlite DB_DATABASE=:memory: - 优化MySQL配置:如果必须用MySQL,给db服务添加性能优化参数,比如在environment中加入:
MYSQL_INITDB_ARGS="--innodb-buffer-pool-size=256M --query-cache-type=1 --query-cache-size=64M" - 把依赖包打包进镜像:避免通过挂载卷共享vendor目录,在Dockerfile里添加
RUN composer install命令,把依赖直接装到镜像里,减少跨文件系统的IO开销。
内容的提问来源于stack exchange,提问作者MrCujo
相关产品推荐
相关产品推荐

