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
相关产品推荐
相关产品推荐

