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

Docker/Laravel Sail设置测试数据库时遇权限拒绝问题求助

Laravel Sail配置测试数据库遇权限拒绝问题解决

环境配置

  • 电脑:Macbook Pro 13.2.1 (22D68)
  • Laravel版本:9
  • Docker版本:4.16.2 (95914)

问题描述

尝试通过docker-compose在Laravel Sail应用中创建两个测试数据库,按照资料在docker-compose.yml中添加了如下映射:

'./docker/8.0/create-testing-databases.sql:/docker-entrypoint-initdb.d/create-testing-databases.sh'

不清楚该配置的原因,且项目中并未生成create-testing-databases.sh文件,每次执行./vendor/bin/sail up时,创建测试数据库的脚本都会报权限拒绝错误。

终端错误输出片段

admin-20-mysql-1         | 2023-02-21 16:44:17+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/create-testing-databases.sh
admin-20-mysql-1         | /usr/local/bin/docker-entrypoint.sh: line 69: /docker-entrypoint-initdb.d/create-testing-databases.sh: Permission denied

当前配置文件

./docker/8.0/create-testing-databases.sql(项目根目录下)

CREATE DATABASE IF NOT EXISTS `custom_testing_db`;
GRANT ALL PRIVILEGES ON  `custom_testing_db`.* TO 'web'@'%';

CREATE DATABASE IF NOT EXISTS `custom_testing_db2`;
GRANT ALL PRIVILEGES ON  `custom_testing_db2`.* TO 'web'@'%';

docker-compose.yml(项目根目录下)

# For more information: https://laravel.com/docs/sail
version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.1
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.1/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${HMR_PORT:-8080}:8080'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
    mysql:
        image: 'mysql'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: "%"
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './docker/8.0/create-testing-databases.sql:/docker-entrypoint-initdb.d/create-testing-databases.sh'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
    redis:
        image: redis:alpine
        container_name: admin-redis
        command: redis-server --appendonly yes
        volumes:
            - ./data/redis:/data
        ports:
            - "8002:6379"
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local

解决步骤

问题根源

  1. 映射时错误地将.sql文件重命名为.sh后缀,MySQL容器的启动脚本会尝试把该文件当作Shell脚本执行,但SQL文件本身没有可执行权限,因此触发权限拒绝错误。
  2. 无需手动生成create-testing-databases.sh文件,MySQL容器会自动执行/docker-entrypoint-initdb.d/目录下的.sql文件。

具体操作

  1. 修正docker-compose.yml映射配置
    修改mysql服务的volumes配置,将目标文件名改回.sql:

    volumes:
        - 'sail-mysql:/var/lib/mysql'
        - './docker/8.0/create-testing-databases.sql:/docker-entrypoint-initdb.d/create-testing-databases.sql'
    
  2. 清理已有数据卷(首次配置后已启动过容器需执行)
    MySQL初始化脚本仅在数据卷首次创建时执行,因此需要删除旧数据卷:

    ./vendor/bin/sail down -v
    
  3. 重新启动容器

    ./vendor/bin/sail up -d
    
  4. 验证数据库创建结果
    进入MySQL容器查看数据库:

    ./vendor/bin/sail mysql
    

    执行命令SHOW DATABASES;,即可看到custom_testing_db和custom_testing_db2两个测试数据库。

期望结果

在localhost:3306的MySQL服务器中成功创建两个测试数据库:

  • custom_testing_db
  • custom_testing_db2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:46:02