【问题标题】:How to fix SQLSTATE[HY000] [2002] Connection refused, when running : php artisan migrate in docker bash?如何修复 SQLSTATE[HY000] [2002] 连接被拒绝,运行时:php artisan migrate in docker bash?
【发布时间】:2022-01-24 13:20:30
【问题描述】:

在成功安装mysql、nginx、php等容器后,我正在尝试在docker app容器bash中运行“php artisan migrate”。

但是出现了这个错误:

SQLSTATE[HY000] [2002] Connection denied (SQL: select * from information_schema.tables where table_schema = code_clan and table_name = migrations and table_type = 'B ASE表')

这是我的文件夹/文件结构:

> docker-my-app(folder)
  > docker(folder)
    > nginx(folder)
      > default.conf
    > php-fpm(folder)
      > Dockerfile
  > src(folder)
    > www(folder)
      > Laravel Project Files...
      > **.env**

  **docker-compose.yml**

这是我的作曲家文件(docker-compose.yml):

version: '3.8'

services:

  nginx:
    ports:
      - "80:80"
    image: nginx
    tty : true
    restart: unless-stopped
    volumes:
      - ./src/www:/usr/share/nginx/html:delegated
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      - thenetwork
  
  app:
    build: ./docker/php-fpm
    container_name: myapp
    tty : true
    restart: unless-stopped
    environment:
      SERVICE_NAME: myapp
      SERVICE_TAGS: dev
    networks:
      - thenetwork
    working_dir: /usr/share/nginx/html
    volumes:
      - ./src/www:/usr/share/nginx/html
      - ./data/upload:/storage/uploads
  
  memcached:
    image: memcached

  mysql:
    ports:
      - "3306:3306"
    image: mysql:5.6
    restart: unless-stopped
    tty: true
    volumes:
      - mysqlvolume:/var/lib/mysql
      - ./data/mysql-import:/docker-entrypoint-initdb.d
    environment:
        - MYSQL_ROOT_PASSWORD=pwd
        - MYSQL_HOST=localhost
        - MYSQL_PORT=3306
    networks:
      - thenetwork

  redis:
    ports:
      - "6379:6379"
    image: redis



#Docker netwtorks
networks:
  thenetwork:
    driver: bridge
volumes:
  mysqlvolume:
    driver: local

这是我的 .env 文件(在 laravel 项目的根目录中):

APP_NAME=MyApp
APP_ENV=local
APP_KEY=base64:generatedKey
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=daily
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lara_app
DB_USERNAME=root
DB_PASSWORD=pwd
...

在 docker-my-app cmd 中,我运行:

 docker exec -it myapp bash

在里面,我跑:

/usr/share/nginx/html$ php artisan migrate

所有容器,包括 mysql 都运行成功。 并且发生了开头提到的错误。

你能弄清楚这里发生了什么吗?

【问题讨论】:

  • 在 .env 中将 127.0.0.1 更改为 mysql 并运行 php artisan optimize

标签: mysql laravel docker


【解决方案1】:

尝试不同方式后:

  1. 比如为 docker-compose.yml 设置一个 .env 文件
  2. 并尝试清除 docker myapp bash 中的 laravel 配置和缓存文件的缓存,如下所示:
php artisan config:clear
php artisan cache:clear
  1. 最后将 laravel root .env 文件中的 DB_HOST 常量从 127.0.0.1 更改为 mysql,解决了我的问题和迁移现在与mysql相关的一切都很好。原因是我将docker-compose.yml文件中的mysql服务命名为mysql。

.env 文件:

APP_NAME=MyApp
APP_ENV=local
APP_KEY=base64:generatedKey
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=daily
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
**DB_HOST=mysql**
DB_PORT=3306
DB_DATABASE=lara_app
DB_USERNAME=root
DB_PASSWORD=pwd
...

【讨论】:

  • 我有相同的设置并遇到了同样的问题。在运行迁移时,从容器中的 bash 执行迁移可能不太方便,就像您正在执行的操作与直接从主机执行迁移一样。最初,我会从主机端执行一些命令,例如 composer、npm 等。后来,我只是将 composer 和 npm 添加到我的容器构建中,因此我不依赖于在主机上安装我的开发工具。我认为从 DockerFile 安装 composer 相对容易: RUN curl -sS getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 2021-07-10
  • 2022-10-25
  • 2018-11-12
  • 2017-05-04
  • 2020-01-22
相关资源
最近更新 更多