小工具知识网

当前位置: 首页 > 行业知识 > linux docker 部署mysql8以上版本时弹出Access denied for user root @ localhost (using password: YES)的解决方案

行业知识

linux docker 部署mysql8以上版本时弹出Access denied for user root @ localhost (using password: YES)的解决方案

2026-11-15 03:11:00 来源:互联网转载

该���论使用于java启动报错 也试用于windows连接报错 不止linux docker

一、直接说结论,再来说原因和我的bug寻找过程:

        1.配置文件的mysql或者命令参数的密码需要带英文单引号

        2.不可以挂载之前别的容器使用过的mysql数据目录或者你的执行命令里改过密码,比如之前是run mysql password 123  你改成了run mysql password 456

二、排查和分析:

环境:centons7

docker部署时命令如下:

#原部署文件代码mysql:    image: mysql:latest    container_name: mysql_app    environment:      # 时区上海      TZ: Asia/Shanghai      # root 密码      MYSQL_ROOT_PASSWORD: 011234      # 初始化数据库(后续的初始化sql会在这个库执行)      MYSQL_DATABASE: appdatabase    ports:      - "3307:3306"    volumes:      - "/app/mysql/data:/var/lib/mysql"      - "/app/mysql/init:/docker-entrypoint-initdb.d"    command:      --character-set-server=utf8mb4      --collation-server=utf8mb4_general_ci

通过docker将服务部署完后,navicat连接报错,密码错误,于是我尝试进入mysql容器登录 发现也报错。

于是我便查找网上的方法 清一色全是改密码。没卵用,你每次启动容器都去改一次密码???还麻烦的要*** 况且在容器内你怎么改配置文件改密码。。。

于是我开始尝试把docker compose用gpt改成docker run  一条命令一条命令删除执行删除执行

最终发现gpt的密码多了单引号,于是我在命令里加了单引号 成功连接不报错

然后我以为解决了 我又把密码改成了‘123’,发现又报错密码错误了

这时候我开始分别一条条删除以下的附加命令分别run执行,最后定位到data目录这句删了以后就连接不报错了 


    ports:

      - "3307:3306"

    volumes:

      - "/app/mysql/data:/var/lib/mysql"--------------关键报错代码
      - "/app/mysql/init:/docker-entrypoint-initdb.d"

    privileged: true

    restart: always

于是我得出结论:

mysql8登录第一次遇到MYSQL_ROOT_PASSWORD时会自动把该密码尽兴登录,生成一个秘钥放在mysql的数据文件里面,命令里带的MYSQL_ROOT_PASSWORD密码是个参数,除了第一次运行mysql带上会设置密码生成秘钥,其他次启动而不是设置mysql的密码,而是作为参数去验证这个最初的秘钥是否核对正确,于是我进入挂载的data目录,发现我的猜想是对的。至此结束。

上一篇:自定义字段实战指南,轻松掌握核心步骤,快速上手!

下一篇:申请化妆品备案怎么写模板