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

时间:2020-03-06 12:43:17

标签: mysql laravel docker vue.js docker-compose

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

我以这些文章为指导link link

我的docker compose工作正常,Web和应用程序服务运行良好,应按需进行部署。但是我无法配置我的数据库。 我正在尝试执行select t1.id, t1.name, max(case when t2.name2 = 'xyz1' then t2.use else 'false' end) as xyz1, max(case when t2.name2 = 'xyz2' then t2.use else 'false' end) as xyz2, max(case when t2.name2 = 'xyz3' then t2.use else 'false' end) as xyz3 from table3 t3 join table1 t1 on t3.fk_id1 = t1.id join table2 t2 on t3.fk_id2 = t2.id group by t1.id, t1.name; ,但是我没有SQLSTATE这样的文件或目录异常,因此在此卡住了3天。

我已经阅读了有关此问题的所有评论,但可以获得解决方案。我已将所有特权授予数据库中的root用户。我尝试使用容器ip或容器db名称更改dbhost,我也尝试过更改数据库名称的database.php主机,但是它也不起作用。

我认为我的错误可能出在我的docker-compose exec app php artisan migrate

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

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

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

这是我的docker-compose.yml

"unix_socket' => '/var/run/mysqld/mysqld.sock',"

app.dockerfile

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:   

db.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

web.dockerfile

FROM mysql:5.7

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

.env

FROM nginx:1.10

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

vhost.config

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

这是我的.cnf

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;
    }
}

当我尝试迁移mysql数据库时,返回此错误:

    [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'),
            ]) : [],
        ],

1 个答案:

答案 0 :(得分:0)

首先,如果您执行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

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