docker-compose : 服务器请求客户端未知的身份验证方法
docker-compose : The server requested authentication method unknown to the client
我有这个 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
然后我得到这个错误:
这对我有用:
image: mysql:5.7
如果您遇到此错误但仍希望使用 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
因为我刚刚花了最后 3 个小时来寻找这个相同问题 的解决方案,我想我应该扩展 Hatef 的回答。将命令 --default-authentication-plugin=mysql_native_password
添加到容器中 但您必须首先 运行 以下一组命令 :
docker rm $(docker ps -a -q)
docker volume prune -f
这是因为如果不清理容器(是的,标记为已退出的容器),并非所有卷都会被 p运行ed。如果您不 p运行e 所有的卷,数据库将从先前的实例中保留下来。这令人困惑,因为容器被认为是孤立的实例,但如果卷在它们之间持久存在则不是。
请注意,这会解决 phpmyadmin 和任何其他基于 php 的 mysql 维护工具中的相同消息。
为了让事情变得更简单,我编写了一个 powershell 脚本来处理安装之间 process/volumes 的清理。
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
您可以在图像后添加此行,它会再次开始工作。
command: --default-authentication-plugin=mysql_native_password
我有这个 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
然后我得到这个错误:
这对我有用:
image: mysql:5.7
如果您遇到此错误但仍希望使用 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
因为我刚刚花了最后 3 个小时来寻找这个相同问题 的解决方案,我想我应该扩展 Hatef 的回答。将命令 --default-authentication-plugin=mysql_native_password
添加到容器中 但您必须首先 运行 以下一组命令 :
docker rm $(docker ps -a -q)
docker volume prune -f
这是因为如果不清理容器(是的,标记为已退出的容器),并非所有卷都会被 p运行ed。如果您不 p运行e 所有的卷,数据库将从先前的实例中保留下来。这令人困惑,因为容器被认为是孤立的实例,但如果卷在它们之间持久存在则不是。
请注意,这会解决 phpmyadmin 和任何其他基于 php 的 mysql 维护工具中的相同消息。
为了让事情变得更简单,我编写了一个 powershell 脚本来处理安装之间 process/volumes 的清理。
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
您可以在图像后添加此行,它会再次开始工作。
command: --default-authentication-plugin=mysql_native_password