【问题标题】:docker-compose : The server requested authentication method unknown to the clientdocker-compose :服务器请求客户端未知的身份验证方法
【发布时间】:2018-10-10 08:14:31
【问题描述】:

我有这个 yml 文件用于在 docker 中配置 MySQL:

# Use root/example as user/password credentials
version: '3.1'

services:

  db:
    image: mysql
    restart: always
    environment:
       MYSQL_ROOT_PASSWORD: 'pass'
       MYSQL_DATABASE: 'db'
       MYSQL_USER: 'user'
       MYSQL_PASSWORD: 'pass'

  adminer:
    image: adminer
    restart: always
    ports:
      - 8888:8080

我使用以下命令从 yml 所在的同一目录启动容器:

docker-compose -f stack.yml up

然后我得到了这个错误:

【问题讨论】:

    标签: mysql docker docker-compose mysql-8.0


    【解决方案1】:

    您可以在图像后添加这一行,它会再次开始工作。

    command: --default-authentication-plugin=mysql_native_password
    

    【讨论】:

      【解决方案2】:

      由于我刚刚花了 3 个小时来寻找解决这个相同问题的方法,我想我会扩展 Hatef 的答案。将命令 --default-authentication-plugin=mysql_native_password 添加到容器中可以但您必须首先运行以下命令集:

      docker rm $(docker ps -a -q)
      docker volume prune -f
      

      这是因为如果不清理容器(是的,标记为已退出的容器),并非所有卷都会被修剪。而且,如果您不修剪所有卷,则数据库将从先前的实例中持续存在。这很令人困惑,因为容器被认为是孤立的实例,但如果卷在它们之间持续存在,则不是。

      请注意,这会在 phpmyadmin 和任何其他基于 php 的 mysql 维护工具中解析相同的消息。


      为了让事情变得更简单,我编写了一个 powershell 脚本来处理安装之间的进程/卷的清理。

      Write-Host 'Begin configuring MySQL Server'
      $server = @{
          name = 'testdb';
          mysql_database = 'test';
          mysql_user = 'test';
          mysql_pass = '';
          mysql_root_pass = '';
          mysql_port = '3306';
          mysql_version = 'latest';
          adminer_port = '8080';
          adminer_version = 'latest';
      };
      $stackFilePath = '.\stack.yml';
      if (Test-Path $stackFilePath)
      {
          Write-Host 'Cleaning up old configuration file'
          Remove-Item $stackFilePath
      }
      $stack = @"
      version: '3.7'
      services:
        mysql:
          image: mysql:$($server.mysql_version)
          container_name: $($server.name)-mysql
          command: --default-authentication-plugin=mysql_native_password
          environment:
            - MYSQL_ROOT_PASSWORD=$($server.mysql_root_pass)
            - MYSQL_DATABASE=$($server.mysql_database)
            - MYSQL_USER=$($server.mysql_user)
            - MYSQL_PASSWORD=$($server.mysql_pass)
            - MYSQL_PORT=$($server.mysql_port)
            - MYSQL_ALLOW_EMPTY_PASSWORD=true
          restart: always
          ports:
            - $($server.mysql_port):$($server.mysql_port)
          expose:
            - $($server.mysql_port)
        adminer:
          image: adminer:$($server.adminer_version)
          container_name: $($server.name)-adminer
          depends_on:
            - mysql
          restart: always
          ports:
            - $($server.adminer_port):8080
      "@;
      Write-Host 'Writing new configuration file'
      $stack | Out-File -FilePath $stackFilePath
      
      Write-Host 'Clean up old processes'
      docker rm $(docker ps -a -q)
      
      Write-Host 'Clean up old volumes'
      docker volume prune -f
      
      Write-Host 'Create service from configurations'
      docker-compose -f $stackFilePath up
      

      【讨论】:

      • docker-compose down -v 可能会简单一些
      【解决方案3】:

      如果您遇到此错误但仍希望使用 MySQL v.8。您可以通过告诉 MySQL Server 使用旧的身份验证插件来做到这一点。

      因此,您的撰写文件将如下所示:

      # Use root/example as user/password credentials
      
      version: '3.1'
      
      services:
      
        db:
          image: mysql
          command: --default-authentication-plugin=mysql_native_password
          restart: always
          environment:
             MYSQL_ROOT_PASSWORD: 'pass'
             MYSQL_DATABASE: 'db'
             MYSQL_USER: 'user'
             MYSQL_PASSWORD: 'pass'
      
        adminer:
          image: adminer
          restart: always
          ports:
            - 8888:8080
      

      【讨论】:

      • @slayerbleast 你必须重新初始化数据库
      • @NathanOsman 是对的,您必须删除该容器,如果有任何卷,请删除卷,然后重新构建它。然后它将起作用。刚刚尝试过,它对我有用。
      【解决方案4】:

      这对我有用:

      image: mysql:5.7
      

      【讨论】:

      • 5:37 小时。从字面上看,需要 5:37 小时才能找到此解决方案。
      • 当作者在问题中明确使用 MySQL 8.0 标签时,为什么建议使用较旧的 MySQL 5.7 而不是稳定的 MySQL 8.0 作为解决方案?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 2015-05-02
      • 2020-12-03
      • 2018-11-06
      • 2019-02-21
      相关资源
      最近更新 更多