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

Docker环境下Laravel Dusk无法登录用户问题排查

Laravel Dusk在Docker环境中loginAs失效,重定向至登录页

Homestead环境下运行正常的Laravel Dusk应用,迁移到Docker后,Dusk和Selenium均启动成功,但调用loginAs方法后会重定向到登录页面,无法完成用户登录;Homestead中该方法可正常工作,怀疑是容器间会话共享问题。

可能的原因及解决办法

1. 会话驱动容器共享问题

如果Laravel用的是文件会话驱动,Docker环境里PHP容器的会话存储目录和Nginx、Selenium容器不共享,会直接导致会话丢失。

  • 解决:改用Redis或数据库作为会话驱动,确保所有容器都能访问会话存储。在.env中修改:
    SESSION_DRIVER=redis
    REDIS_HOST=redis  # 对应docker-compose里的redis服务名
    

2. Dusk测试域名配置错误

Selenium容器访问应用时,得用容器内部的服务域名,不能用宿主机的localhost。

  • 检查DuskTestCase.php里的baseUrl配置,改成Nginx容器的服务名:
    protected function baseUrl()
    {
        return 'http://nginx';
    }
    

3. 域名不一致导致Cookie无法共享

如果.env里的APP_URL设的是宿主机域名(比如http://localhost),但Selenium从容器内部访问的是http://nginx,域名不匹配会让Cookie无法正确携带,会话直接失效。

  • 统一.env中的APP_URL为容器内部可访问的地址:
    APP_URL=http://nginx
    

4. 容器网络配置问题

确认所有容器(PHP、Nginx、Selenium、Redis/MongoDB)都在同一个网络下(你的配置已经用了my-app-net外部网络,要确保网络配置正确,容器之间能互相访问)。

5. 缓存残留问题

Docker环境可能存在缓存残留,清理应用缓存试试:

# 进入PHP容器执行命令
php artisan cache:clear
php artisan config:clear

相关配置代码

docker-compose.yml

volumes:
  vendor: ~
  node_modules: ~
  public: ~

services:
  nginx:
    container_name: myapp-nginx-dev
    build:
      context: .
      dockerfile: ./dockerfiles/Dockerfile.dev.nginx
    ports:
      - "80:80"
    volumes:
      - ./build/nginx/conf.d/dev.conf:/etc/nginx/conf.d/default.conf
      - public:/var/www/html/public
    restart: unless-stopped
    depends_on:
      php:
        condition: service_started
      node:
        condition: service_started
    networks:
      - my-app-net

  php:
    container_name: my-app-php-dev
    hostname: my-app-php-dev
    build:
      context: .
      dockerfile: ./dockerfiles/Dockerfile.dev.php
    volumes:
      - vendor:/var/www/html/vendor
      - .:/var/www/html
      - ./build/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
    env_file:
      - .env
    environment:
      XDEBUG_CONFIG: remote_host=host.docker.internal remote_port=9001
    restart: unless-stopped
    depends_on:
      mongodb:
        condition: service_healthy
      redis:
        condition: service_healthy
    networks:
      - my-app-net

  selenium:
    container_name: my-app-selenium-dev
    image: selenium/standalone-chrome:4.3
    volumes:
      - /dev/shm:/dev/shm
    ports:
      - "4444:4444"
      - "7900:7900"
    networks:
      - my-app-net
    depends_on:
      - php

networks:
  my-app-net:
    external: true

测试代码

public function testTheTest() {
    $this->browse(function (Browser $browser) {
        $browser->loginAs($this->administrator)
        ->visit(self::URL)
        ->screenshot('test')
        ->assertSee('Departments');
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:03:09