我正在对我的 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
我建议您调整
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
环境变量。