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
解决步骤
问题根源
- 映射时错误地将
.sql文件重命名为.sh后缀,MySQL容器的启动脚本会尝试把该文件当作Shell脚本执行,但SQL文件本身没有可执行权限,因此触发权限拒绝错误。 - 无需手动生成
create-testing-databases.sh文件,MySQL容器会自动执行/docker-entrypoint-initdb.d/目录下的.sql文件。
具体操作
修正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'清理已有数据卷(首次配置后已启动过容器需执行)
MySQL初始化脚本仅在数据卷首次创建时执行,因此需要删除旧数据卷:./vendor/bin/sail down -v重新启动容器
./vendor/bin/sail up -d验证数据库创建结果
进入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
相关产品推荐
相关产品推荐

