14

我有这个 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

然后我得到了这个错误:

然后我在登录时收到以下错误

4

4 回答 4

23

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

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

# 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
于 2018-12-02T12:05:50.980 回答
8

这对我有用:

image: mysql:5.7
于 2018-05-04T07:44:02.933 回答
7

由于我刚刚花了 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
于 2019-11-03T18:33:53.247 回答
0

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

command: --default-authentication-plugin=mysql_native_password
于 2021-11-19T19:46:54.077 回答