【问题标题】:Laravel dockerized app taking DB_HOST as SERVER_ADDR instead of containerLaravel dockerized 应用程序将 DB_HOST 作为 SERVER_ADDR 而不是容器
【发布时间】:2020-12-26 00:10:03
【问题描述】:

我有一个 laravel 应用,数据库容器是这样配置的:

db:
  image: "mysql:5.7"
  command: ["--sql- mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"]
  environment:
    MYSQL_DATABASE: mydb
    MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
  volumes:
   - db_data:/var/lib/mysql
  restart: unless-stopped
  networks:
    - simple_net

app:
    build:
      context: .
      dockerfile: ./setup/Dockerfile
    restart: unless-stopped
    tty: true
    ports:
      - "${APP_PORT}:80"
    working_dir: /var/www/
    volumes:
      - ./:/var/www/
    environment: 
      DB_CONNECTION: mysql
      DB_HOST: db
      DB_DATABASE: mydb
      DB_USERNAME: root
     # SERVER_ADDR: localhost

当我尝试使用 docker-compose up 启动应用程序时,它会抛出一个异常,提示 SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.23.0.6' (using password: NO). IP 指的是环境变量 SERVER_ADDR,我尝试使用值 localhost 和 ''(空)来设置它,但是到目前为止没有任何效果。

【问题讨论】:

    标签: mysql laravel docker docker-compose


    【解决方案1】:

    您应该将 .env 的 DB_HOST 设置为容器的名称,在您的情况下为 db

    DB_HOST=db

    我不相信注入环境变量会取代填充 .env。

    此外,如果您想 Dockerize 您的 Laravel 应用程序,已经有几个选项已经存在并且开箱即用:

    【讨论】:

    • 没用。仍然保持来自被拒绝 IP 的连接
    • 你能从你的主机连接到你的数据库吗?
    • 否,用户 'root'@'localhost' 的访问被拒绝(使用密码:否)
    • 那么你的问题不在于 Laravel,而在于你的数据库容器。也许尝试使用密码,或者看看我上面链接的包是如何做到的。
    【解决方案2】:

    那里不需要DB_CONNECTION: mysql

    您将在 lavel 中的 .env 文件中使用以下代码:

      DB_CONNECTION: mysql
      DB_HOST: db
      DB_PORT: 3306
      DB_DATABASE: mydb
      DB_USERNAME: root
      DB_PASSWORD: password
    

    你的app 容器不需要这个环境,那是你的服务器在运行。您尝试在将运行您的应用程序的服务器容器内配置 db 容器的环境。

    将您的 docker-compose 更改为:

    db:
      image: "mysql:5.7"
      command: ["--sql- mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"]
      environment:
          MYSQL_ROOT_USER: root
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATBASE: mydb
          MYSQL_USER: root
          MYSQL_PASSWORD: password
          SERVICE_TAGS: dev
          SERVICE_NAME: mysql
      volumes:
       - db_data:/var/lib/mysql
      restart: unless-stopped
      networks:
        - simple_net
    
    app:
        build:
          context: .
          dockerfile: ./setup/Dockerfile
        restart: unless-stopped
        tty: true
        ports:
          - "${APP_PORT}:80"
        working_dir: /var/www/
        volumes:
          - ./:/var/www/
        networks:
          - simple_net
    

    在您的网络下桥接您的容器,以便它们可以相互交互。

    运行 docker-compose up --build 然后访问你的 laravel 容器并在容器内运行 php artisan optimize 为路由、环境变量、文件等配置缓存。

    docker exec -it db mysql -u root -p password
    

    根据您的 cmets,您在访问容器时遇到问题,原因是您没有为其使用凭据,而 mysql 尝试使用默认凭据。上面的命令定义了正确的用户和密码,你也会被要求填写密码。

    mysql还有更多参数来定义主机等,你可以进一步看看。

    【讨论】:

    • 没用。当我尝试 docker-compose exec db mysql 时,我收到了这个错误。用户 'root'@'localhost' 的访问被拒绝(使用密码:否)。我尝试再次删除并拉取图像
    • 你试过我发给你的 docker 命令了吗?这将重建你所有的容器。您正在尝试的命令是访问 db 容器的命令,而您做错了。当您尝试从命令行连接到 mysql 时,您必须发送用户名、传递等作为参数。因此,您的错误是意料之中的,因为您只是尝试访问 mysql 而不发送正确的参数,而 mysql 使用默认参数。
    • 我试过 docker-compose build --no-cache。我什至删除了所有卷,删除了 mysql:5.7 映像并再次将其拉回。我什至尝试过使用 mariadb。我尝试添加环境变量 MYSQL_ROOT_HOST: '%' 但没有任何效果
    • 您的容器是否已启动并正在运行?运行 docker ps 并检查你的容器是否真的启动了。这不是图像问题,mysql 命令需要参数,而您没有提供任何参数,这就是 mysql 使用不正确的默认凭据的原因,因此它会因无效而失败
    • 我停止了所有容器,甚至运行了 docker-compose -v,docker-compose build --no-cache,然后是 docker-compose up
    猜你喜欢
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    相关资源
    最近更新 更多