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

Docker化Laravel应用GitHub Actions流水线HTTP 500错误求助

Docker化Laravel应用GitHub Actions测试返回500错误排查求助

问题背景

本地环境执行docker-compose exec -T app php artisan test可正常通过Docker化Laravel应用的测试,但在GitHub Actions流水线中,某个预期返回200的测试出现HTTP 500错误。

已尝试的排查手段

  • 改用GitHub Actions的services替代docker-compose部署应用
  • 确保.env.example和nginx/conf.d/laravel.conf.example正确复制为正式配置文件
  • 验证配置文件内容的正确性
  • 检查容器内文件权限
  • 查看app和webserver容器日志
  • 使用与本地相同版本的docker-compose
  • 强制执行数据库迁移命令
  • 添加等待时间确保init.sh脚本执行完成

相关配置文件

GitHub Actions流水线脚本

name: Laravel Run Tests

on:
  push:
    branches:
      - main
  pull_request:
    types: [opened, reopened, synchronize]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '8.3'

      - name: Install PHP dependencies
        run: |
          cp .env.example .env
          cp nginx/conf.d/laravel.conf.example nginx/conf.d/laravel.conf
          sudo chown -R www-data:www-data .
          sudo chmod -R 777 .
          pwd
          ls -l
          ls -a
          ls -a ./nginx/conf.d
          cat ./nginx/conf.d/laravel.conf
          composer install --no-ansi --no-interaction --no-progress --no-scripts --optimize-autoloader
          php artisan key:generate
          php artisan config:cache

      - name: Install npm dependencies
        run: |
          npm install

      - name: Install Docker Compose
        run: |
          sudo curl -L "https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
          sudo chmod +x /usr/local/bin/docker-compose
          docker-compose --version

      - name: Set up Docker Compose
        run: |
          docker-compose up -d
          sleep 40
          docker-compose exec -T app php artisan migrate --force
          docker ps

      - name: Check file permissions
        run: docker-compose exec -T app ls -l /var/www

      - name: Check logs of app container
        run: docker logs laravel_app

      - name: Check logs of webserver container
        run: docker logs nginx

      - name: Run tests inside Docker container
        run: docker-compose exec -T app php artisan test

docker-compose.yml

services:
    app:
        build:
            context: .
            dockerfile: Dockerfile
        container_name: laravel_app
        working_dir: /var/www
        volumes:
            - ./:/var/www
        networks:
            - laravel
        env_file:
            - .env
        depends_on:
            - db
        healthcheck:
            test: [ "CMD-SHELL", "curl -f http://localhost || exit 1" ]
            interval: 30s
            timeout: 10s
            retries: 5
        restart: unless-stopped

    webserver:
        image: nginx:1.26.0-alpine
        container_name: nginx
        ports:
            - "8081:80"
        volumes:
            - ./:/var/www
            - ./nginx/conf.d:/etc/nginx/conf.d
        depends_on:
            - app
        networks:
            - laravel
        restart: unless-stopped

    db:
        image: mariadb:latest
        container_name: mariadb
        environment:
            MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
            MYSQL_DATABASE: ${DB_DATABASE}
            MYSQL_USER: ${DB_USERNAME}
            MYSQL_PASSWORD: ${DB_PASSWORD}
        volumes:
            - dbdata:/var/lib/mysql
        ports:
            - "3307:3306"
        networks:
            - laravel
        healthcheck:
            test: [ "CMD-SHELL", "mysqladmin ping -h localhost -u ${DB_USERNAME} -p${DB_PASSWORD} || exit 1" ]
            interval: 30s
            timeout: 10s
            retries: 5
        restart: unless-stopped

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        container_name: phpmyadmin
        environment:
            PMA_HOST: db
            MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
        ports:
            -   "8082:80"
        depends_on:
            -   db
        networks:
            -   laravel
        restart: unless-stopped

networks:
    laravel:

volumes:
    dbdata:

Dockerfile

FROM php:8.3.7-fpm

RUN apt-get update && apt-get install -y \
    git \
    unzip \
    zip \
    nodejs \
    netcat-openbsd

RUN docker-php-ext-install pdo_mysql
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
RUN apt-get install -y nodejs
RUN apt-get update && apt-get install -y netcat-openbsd

WORKDIR /var/www

COPY . /var/www

RUN composer install --no-interaction --no-plugins --no-scripts
RUN npm i

COPY init.sh /usr/local/bin/

RUN chmod +x /usr/local/bin/init.sh

CMD ["sh", "/usr/local/bin/init.sh"]

init.sh

#!/bin/sh

chown -R www-data:www-data /var/www

until nc -z -v -w30 db 3306; do
  echo 'Waiting for database connection...'
  sleep 1
done

php artisan migrate

exec php-fpm

目前.env和laravel.conf文件是示例文件的完整副本,恳请协助排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 08:18:14