docker laravel mysql 权限被拒绝

问题描述 投票:0回答:1

我正在对我的 Laravel 应用程序进行 docker 化,但收到此错误

  SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.18.0.3' (using password: YES) (SQL: select * from information_schema.tables where table_schema = testdb and table_name = migrations and table_type = 'BASE TABLE')

docker-compose.yml

版本:“3.8” 服务:

# PHP Service
php:
    build:
        context: .
        target: php
        args:
            - APP_ENV="${APP_ENV}"
    environment:
        - APP_ENV="${APP_ENV}"
        - CONTAINER_ROLE=app
    working_dir: /var/www
    volumes:
        - ./:/var/www
    ports:
        - 8000:8000
    depends_on:
        - database
database:
    image: mysql:8.2
    ports:
        -   3306:3306
    environment:
        - MYSQL_DATABASE=${DB_DATABASE}
        - MYSQL_USER=${DB_USERNAME}
        - MYSQL_PASSWORD=${DB_PASSWORD}
        - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
    volumes:
        - db-data:/var/lib/mysql

volumes:
    db-data: ~

Dockerfile

FROM php:8.2 as php

RUN apt-get update -y
RUN apt-get install -y unzip libpq-dev libcurl4-gnutls-dev
RUN docker-php-ext-install pdo pdo_mysql bcmath

#RUN pecl install -o -f redis \
#    && rm -rf /tmp/pear \
#    && docker-php-ext-enable redis

WORKDIR /var/www
COPY . .

COPY --from=composer:2.7.4 /usr/bin/composer /usr/bin/composer

ENV PORT=8000
ENTRYPOINT [ "./docker/entrypoint.sh" ]

.env

APP_NAME=ArtisanOga
APP_ENV=local
APP_KEY=base64:3Xsn8ZJVdxfgfg1+e6CqdWWIX/SNGW49T7AL4N6C73E=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=root
DB_PASSWORD=secret
mysql laravel docker docker-compose dockerfile
1个回答
0
投票

我建议您调整

docker-compose.yml
,以便 PHP 服务等待数据库准备好接受连接。您可以通过向
database
服务添加运行状况检查,然后使
php
服务依赖于标记为“健康”的数据库来实现此目的。

对于

php
服务,我还设置了
MYSQL_PWD
环境变量,它将用于数据库连接。

version: "3.9"

services:
  php:
    build:
      context: .
      target: php
      args:
          - APP_ENV="${APP_ENV}"
    environment:
      - APP_ENV="${APP_ENV}"
      - CONTAINER_ROLE=app
      - MYSQL_PWD=${DB_PASSWORD}
    working_dir: /var/www
    volumes:
      - ./:/var/www
    ports:
      - 8000:8000
    depends_on:
      database:
        condition: service_healthy

  database:
    image: mysql:8.2
    ports:
      -   3306:3306
    environment:
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
    volumes:
      - db-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping"]
      interval: 5s
      timeout: 5s
      retries: 5

volumes:
    db-data: ~

我不确定你的

entrypoint.sh
包含什么,但通过以下内容我能够获得与数据库的可靠连接。

#!/bin/bash

mysql -h database -u root -e 'select 1;'

现在不需要密码,因为它来自

MYSQL_PWD
环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.