我无法在我的 docker compose 中进行 mysql php artisan 迁移。错误 SQLSTATE[HY000] [2002]

Posted

技术标签:

【中文标题】我无法在我的 docker compose 中进行 mysql php artisan 迁移。错误 SQLSTATE[HY000] [2002]【英文标题】:I can't do mysql php artisan migrations in my docker compose. Error SQLSTATE[HY000] [2002] 【发布时间】:2020-06-19 04:55:27 【问题描述】:

我目前正在使用 docker compose 开发一个 laravel-vue-mysql 环境。

我以这些文章为指导linklink

我的 docker compose 运行良好,网络和应用程序服务运行良好,并且部署正常。但我无法配置我的数据库。 我正在尝试执行docker-compose exec app php artisan migrate,但我的 SQLSTATE 没有这样的文件或目录异常,我被困了 3 天。

我已阅读有关此问题的所有 cmets,但可以找到解决方案。我已将所有权限授予我的数据库中的 root 用户。我尝试使用容器 ip 或容器数据库名称更改我的 dbhost,我也尝试为我的数据库名称更改 database.php 主机,但它也不起作用。

我认为我的错误可能在我的"unix_socket' => '/var/run/mysqld/mysqld.sock',"

我想澄清这条路线,我是通过登录我的 docker mysql 服务并在我的数据库中输入一个命令获得的。我不知道我是否必须放 mysql.lock 本地路由 这是 /tmp/mysql.sock

或者它可能是我的 database_url 路由,我不确定我做错了什么。需要一些帮助。

我想在我的 mysql docker 服务中创建数据表

这是我的 docker-compose.yml

version: '2'
services:

  # The Application
  app:
    build:
      context: ./
      dockerfile: app.dockerfile
    container_name: app      
    working_dir: /var/www
    volumes:
      - ./:/var/www
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"

  # The Web Server
  web:
    build:
      context: ./
      dockerfile: web.dockerfile
    container_name: web      
    working_dir: /var/www
    volumes_from:
      - app
    ports:
      - 8080:80

# The Database
  database:
    build:
      context: ./
      dockerfile: db.dockerfile
    image: mysql:5.7
    container_name: db  
    environment:
      - "MYSQL_DATABASE=homestead"
      - "MYSQL_USER=root"
      - "MYSQL_PASSWORD=secret"
      - "MYSQL_ROOT_PASSWORD=secret"
    volumes:
      - dbdata:/var/lib/mysql
    ports:
        - "33061:3306"
#Volumes
volumes:
  dbdata:   

app.dockerfile

FROM php:7.3-fpm

# Update packages
RUN apt-get update

# Install PHP and composer dependencies
RUN apt-get install -qq git curl libmcrypt-dev libjpeg-dev libpng-dev libfreetype6-dev libbz2-dev

# Clear out the local repository of retrieved package files
# RUN apt-get clean

# Install needed extensions
# Here you can install any other extension that you need during the test and deployment process
RUN apt-get -y install libzip-dev
RUN pecl install mcrypt-1.0.3 
RUN docker-php-ext-enable mcrypt
RUN apt-get clean; docker-php-ext-install pdo pdo_mysql zip gd pcntl opcache bcmath


# Installs Composer to easily manage your PHP dependencies.
RUN curl --silent --show-error https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# Install Node
RUN apt-get update &&\
    apt-get install -y --no-install-recommends gnupg &&\
    curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
    apt-get update &&\
    apt-get install -y --no-install-recommends nodejs &&\
    npm config set registry https://registry.npm.taobao.org --global &&\
    npm install --global gulp-cli

CMD php-fpm

db.dockerfile

FROM mysql:5.7

# Setup the custom configuration
ADD my.cnf /mysql/mysql.conf.d/my.cnf

web.docker 文件

FROM nginx:1.10

ADD vhost.conf /etc/nginx/conf.d/default.conf
WORKDIR /var/www

.env

DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=secret
DATABASE_URL=mysql://root:@database:33061/homestead

vhost.config

server 
    listen 80;
    index index.php index.html;
    root /var/www/public;

    location / 
        try_files $uri /index.php?$args;
    

    location ~ \.php$ 
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    

这是我的 .cnf

    [mysqld]
    # Accept connections from any IP address
    general_log = 1
    general_log_file = /var/lib/mysql/general.log
    bind-address                = 0.0.0.0
    socket= /var/run/mysqld/mysqld.sock
    #skip-grant-tables

This is my app/config/database.php 

     'mysql' => [
            'driver'=>'mysql',
            'url'=>env('DATABASE_URL'),
            'host'=>env('DB_HOST','database'),
            'port'=>env('DB_PORT','3306'),
            'database'=>env('DB_DATABASE', 'forge'),
            'username'=>env('DB_USERNAME', 'forge'),
            'password'=>env('DB_PASSWORD', ''),
            'unix_socket'=>'/var/run/mysqld/mysqld.sock',
            'charset'=>'utf8mb4',
            'collation'=>'utf8mb4_unicode_ci',
            'prefix'=>'',
            'prefix_indexes'=>true,
            'strict'=>true,
            'engine'=> null,
            'options'=> extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA =>env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

当我尝试迁移 mysql 数据库时,它返回了这个错误:

Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] No such file or directory (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')

  at /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) 
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         
    673| 

  Exception trace:

  1   Doctrine\DBAL\Driver\PDOException::("SQLSTATE[HY000] [2002] No such file or directory")
      /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:31

  2   PDOException::("SQLSTATE[HY000] [2002] No such file or directory")
      /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:27

  3   PDO::__construct("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=homestead", "root", "secret", [])
      /var/www/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:27

  4   Doctrine\DBAL\Driver\PDOConnection::__construct("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=homestead", "root", "secret", [])
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:67

  5   Illuminate\Database\Connectors\Connector::createPdoConnection("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=homestead", "root", "secret", [])
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:46

  6   Illuminate\Database\Connectors\Connector::createConnection("mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=homestead", [])
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php:24

  7   Illuminate\Database\Connectors\MySqlConnector::connect()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php:182

  8   Illuminate\Database\Connectors\ConnectionFactory::Illuminate\Database\Connectors\closure()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:924

  9   call_user_func(Object(Closure))
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:924

  10  Illuminate\Database\Connection::getPdo()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:959

  11  Illuminate\Database\Connection::getReadPdo()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:404

  12  Illuminate\Database\Connection::getPdoForSelect()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:330

  13  Illuminate\Database\Connection::Illuminate\Database\closure("select * from information_schema.tables where table_schema = ? and table_name = ? and table_type = 'BASE TABLE'")
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:662

  14  Illuminate\Database\Connection::runQueryCallback("select * from information_schema.tables where table_schema = ? and table_name = ? and table_type = 'BASE TABLE'", Object(Closure))
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:629

  15  Illuminate\Database\Connection::run("select * from information_schema.tables where table_schema = ? and table_name = ? and table_type = 'BASE TABLE'", Object(Closure))
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Connection.php:338

  16  Illuminate\Database\Connection::select("select * from information_schema.tables where table_schema = ? and table_name = ? and table_type = 'BASE TABLE'")
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Schema/MySqlBuilder.php:18

  17  Illuminate\Database\Schema\MySqlBuilder::hasTable("migrations")
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Migrations/DatabaseMigrationRepository.php:169

  18  Illuminate\Database\Migrations\DatabaseMigrationRepository::repositoryExists()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:590

  19  Illuminate\Database\Migrations\Migrator::repositoryExists()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:91

  20  Illuminate\Database\Console\Migrations\MigrateCommand::prepareDatabase()
      /var/www/vendor/laravel/framework/src/Illuminate/Database/Console/Migrations/MigrateCommand.php:63

  21  Illuminate\Database\Console\Migrations\MigrateCommand::handle()
      /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32

  22  call_user_func_array([])
      /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32

  23  Illuminate\Container\BoundMethod::Illuminate\Container\closure()
      /var/www/vendor/laravel/framework/src/Illuminate/Container/Util.php:36

  24  Illuminate\Container\Util::unwrapIfClosure(Object(Closure))
      /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:90

  25  Illuminate\Container\BoundMethod::callBoundMethod(Object(Illuminate\Foundation\Application), Object(Closure))
      /var/www/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:34

  26  Illuminate\Container\BoundMethod::call(Object(Illuminate\Foundation\Application), [])
      /var/www/vendor/laravel/framework/src/Illuminate/Container/Container.php:590

  27  Illuminate\Container\Container::call()
      /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php:134

  28  Illuminate\Console\Command::execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      /var/www/vendor/symfony/console/Command/Command.php:255

  29  Symfony\Component\Console\Command\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Illuminate\Console\OutputStyle))
      /var/www/vendor/laravel/framework/src/Illuminate/Console/Command.php:121

  30  Illuminate\Console\Command::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /var/www/vendor/symfony/console/Application.php:1001

  31  Symfony\Component\Console\Application::doRunCommand(Object(Illuminate\Database\Console\Migrations\MigrateCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /var/www/vendor/symfony/console/Application.php:271

  32  Symfony\Component\Console\Application::doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /var/www/vendor/symfony/console/Application.php:147

  33  Symfony\Component\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /var/www/vendor/laravel/framework/src/Illuminate/Console/Application.php:93

  34  Illuminate\Console\Application::run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /var/www/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:131

  35  Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
      /var/www/artisan:37

【问题讨论】:

您在.env 中的值有冲突。我不确定哪个会优先,但我建议让端口号、主机名等都匹配。 你会改变什么? 更改它,以免它们发生冲突。您的 URL 没有密码,但 DB_PASSWORD 有一个值。 URL 的端口与 DB_PORT 不同。 做到了。但它没有用。 :// 【参考方案1】:

首先如果你执行docker exec app env | grep -e DB_ -e DATABASE,你只会看到

DB_PORT=3306
DB_HOST=database

这是由于.env 文件purpose。如果您希望在运行阶段在您的容器中设置其他变量,只需通过这种方式传递它们:

version: '2'
services:

  # The Application
  app:
...
    environment:
      - DB_CONNECTION=$DB_CONNECTION
      - DB_HOST=$DB_HOST
      - DB_PORT=$DB_PORT
      - DB_DATABASE=$DB_DATABASE
      - DB_USERNAME=$DB_USERNAME
      - DB_PASSWORD=$DB_PASSWORD
      - DATABASE_URL=$DATABASE_URL

现在

docker exec app env | grep -e DB_ -e DATABASE
DB_CONNECTION=mysql
DB_HOST=database
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=root
DB_PASSWORD=secret
DATABASE_URL=mysql://root:@database:33061/homestead

您的应用容器知道如何与您的数据库通信

【讨论】:

我有一些问题。我应该在 .env 和 yml 中有相同的变量吗?我的意思是,我昨天用 app_key 变量更新了我的 .env 并且在我的 .yml(#database env 部分)中我应该在那里做同样的事情吗? .env 文件是在执行 .yml 之前将变量设置为当前 compose 的环境(但在优先级和可见性方面与之前的 bash export 不同)。它对结果图像中出现的变量集没有直接影响。所以你需要在environment 部分设置变量,你可以直接硬编码它(如你的清单),或从.env 的环境中获取(如我的)。您也可以使用env_file 选项,但它的行为明显不同

以上是关于我无法在我的 docker compose 中进行 mysql php artisan 迁移。错误 SQLSTATE[HY000] [2002]的主要内容,如果未能解决你的问题,请参考以下文章

在我的 CI 管道中使用 docker-compose vs codeship-services

如何知道我的程序是不是完全在我的 docker 中使用 compose 启动

Docker-compose env var无法正常工作

我无法使用 docker-compose 启动 gitlab-ce

无法在 Windows 10 上使用 docker 访问 localhost:8080

Docker compose api无法连接到主机MongoDB数据库