繁体   English   中英

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中出现“用户 'root'@'localhost'(使用密码:YES)拒绝访问”

[英]MYSQL_ROOT_PASSWORD is set but getting "Access denied for user 'root'@'localhost' (using password: YES)" in docker container

我有一个 docker-compose 文件和一个 Dockerfile。 MySQL 已正确安装。 我已经设置了 MYSQL_ROOT_PASSWORD 但是当尝试访问 mysql 数据库时,出现错误 - 访问被拒绝。 我已经阅读了该站点的其他主题,但无法获得太多帮助。 :(

这是我的 docker-compose 文件:

version: '3'

volumes:
        db_data: {}

services:
    db:
        build:
            context: .
            dockerfile: ./db/Dockerfile
            args:
                - database=iTel
                - password=123
        image: db_image
        volumes:
            - db_data:/var/lib/mysql
        ports:
            - "3306:3306"

和 Dockerfile:

FROM mysql:5.7.15

ARG database
ARG password

RUN echo ${database}
RUN echo ${password}

MAINTAINER me
ENV MYSQL_DATABASE=${database} \
    MYSQL_ROOT_PASSWORD=${password}
ADD ./db/database100.sql /docker-entrypoint-initdb.d
EXPOSE 3306

以下是构建日志:

docker-compose up -d

Building db
Step 1/9 : FROM mysql:5.7.15
5.7.15: Pulling from library/mysql
6a5a5368e0c2: Pull complete
0689904e86f0: Pull complete
486087a8071d: Pull complete
3eff318f6785: Pull complete
3df41d8a4cfb: Pull complete
1b4a00485931: Pull complete
0bab0b2c2630: Pull complete
264fc9ce512d: Pull complete
e0181dcdbbe8: Pull complete
53b082fa47c7: Pull complete
e5cf4fe00c4c: Pull complete
Digest: sha256:966490bda4576655dc940923c4883db68cca0b3607920be5efff7514e0379aa7
Status: Downloaded newer image for mysql:5.7.15
 ---> 18f13d72f7f0
Step 2/9 : ARG database
 ---> Running in 62819f9fc38b
Removing intermediate container 62819f9fc38b
 ---> 863fd3212046
Step 3/9 : ARG password
 ---> Running in ea9d36c1a954
Removing intermediate container ea9d36c1a954
 ---> 056100b1d5eb
Step 4/9 : RUN echo ${database}
 ---> Running in 941bd2f4fc58
iTel
Removing intermediate container 941bd2f4fc58
 ---> 7b2b48e7bd8c
Step 5/9 : RUN echo ${password}
 ---> Running in 9cb80396bb62
123
Removing intermediate container 9cb80396bb62
 ---> 155d184c78ba
Step 6/9 : MAINTAINER me
 ---> Running in 8e3b3b53ce7b
Removing intermediate container 8e3b3b53ce7b
 ---> 9a7617a24800
Step 7/9 : ENV MYSQL_DATABASE=${database}     MYSQL_ROOT_PASSWORD=${password}
 ---> Running in e483e65caf55
Removing intermediate container e483e65caf55
 ---> acf8ac829607
Step 8/9 : ADD ./db/database100.sql /docker-entrypoint-initdb.d
 ---> 42d992439f98
Step 9/9 : EXPOSE 3306
 ---> Running in 4e138502c6f9
Removing intermediate container 4e138502c6f9
 ---> a0818deda593
Successfully built a0818deda593
Successfully tagged db_image:latest
WARNING: Image for service db was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating reve_db_1 ... done

查看容器:

docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
49419cb9980a        db_image            "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        0.0.0.0:3306->3306/tcp   reve_db_1

这是这个容器的日志:

docker logs 49419cb9980a

2020-01-21T07:53:13.050129Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-01-21T07:53:13.051767Z 0 [Note] mysqld (mysqld 5.7.15) starting as process 1 ...
2020-01-21T07:53:13.054945Z 0 [Note] InnoDB: PUNCH HOLE support available
2020-01-21T07:53:13.055053Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2020-01-21T07:53:13.055103Z 0 [Note] InnoDB: Uses event mutexes
2020-01-21T07:53:13.055179Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2020-01-21T07:53:13.055226Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2020-01-21T07:53:13.055268Z 0 [Note] InnoDB: Using Linux native AIO
2020-01-21T07:53:13.055608Z 0 [Note] InnoDB: Number of pools: 1
2020-01-21T07:53:13.055791Z 0 [Note] InnoDB: Using CPU crc32 instructions
2020-01-21T07:53:13.061164Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2020-01-21T07:53:13.072998Z 0 [Note] InnoDB: Completed initialization of buffer pool
2020-01-21T07:53:13.075325Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2020-01-21T07:53:13.101337Z 0 [Note] InnoDB: Highest supported file format is Barracuda.
2020-01-21T07:53:13.142134Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables
2020-01-21T07:53:13.142356Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ...
2020-01-21T07:53:13.184613Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB.
2020-01-21T07:53:13.185628Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active.
2020-01-21T07:53:13.185733Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active.
2020-01-21T07:53:13.186108Z 0 [Note] InnoDB: Waiting for purge to start
2020-01-21T07:53:13.236391Z 0 [Note] InnoDB: 5.7.15 started; log sequence number 12146163
2020-01-21T07:53:13.236828Z 0 [Note] Plugin 'FEDERATED' is disabled.
2020-01-21T07:53:13.237186Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2020-01-21T07:53:13.252074Z 0 [Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key
2020-01-21T07:53:13.252900Z 0 [Note] Server hostname (bind-address): '*'; port: 3306
2020-01-21T07:53:13.253023Z 0 [Note] IPv6 is available.
2020-01-21T07:53:13.253076Z 0 [Note]   - '::' resolves to '::';
2020-01-21T07:53:13.253184Z 0 [Note] Server socket created on IP: '::'.
2020-01-21T07:53:13.269950Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode.
2020-01-21T07:53:13.270581Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode.
2020-01-21T07:53:13.277379Z 0 [Note] InnoDB: Buffer pool(s) load completed at 200121  7:53:13
2020-01-21T07:53:13.295467Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode.
2020-01-21T07:53:13.367019Z 0 [Note] Event Scheduler: Loaded 0 events
2020-01-21T07:53:13.368851Z 0 [Note] mysqld: ready for connections.
Version: '5.7.15'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)

现在进入容器:

docker exec -it 49419cb9980a bash

root@49419cb9980a:/#

我检查了 MYSQL_ROOT_PASSWORD 是否设置正确(在容器中):

root@49419cb9980a:/# echo $MYSQL_ROOT_PASSWORD
123

然后尝试登录mysql:

root@49419cb9980a:/# mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

我的问题是,如何解决这个问题? 为什么我无法访问mysql? 我也尝试过没有密码选项。 这给了我这个错误:

mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

这是我的项目结构:

tree
.
├── db
│   ├── Dockerfile
│   └── database100.sql
└── docker-compose.yml

1 directory, 3 files

以下描述专门针对 MySQL,但许多其他官方 db docker 图像(postgres、mongodb ....)以类似的方式工作 因此,症状(即使用配置的凭据拒绝访问)和解决方法(即删除数据卷以从头开始初始化)是相同的。


理所当然地你已经显示了你的整个启动日志,看起来你是针对一个已经包含 mysql 数据库文件系统的预先存在的db_data卷启动了你的 mysql 容器。

在这种情况下,绝对不会在容器启动时初始化任何东西,环境变量也没有用。 在“环境变量”部分引用官方镜像文档

请注意,如果您使用已包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:任何预先存在的数据库在容器启动时将始终保持不变。

如果你想让你的实例被初始化,你必须从头开始。 当像您的情况一样使用命名卷时,使用 docker compose 很容易。 警告:这将永久删除您的db_data卷中的内容,清除您之前拥有的所有数据库 如果您需要保留内容,请先创建备份。

docker-compose down -v
docker-compose up -d

如果您曾经转换为绑定安装,则必须自己删除所有内容(即rm -rf /path/to/bind/mount/*

如果您在开发服务器上,您可以简单地删除所有未使用的本地卷。 未使用的本地卷是那些没有被任何容器引用的卷:

docker volume prune

我已经使用此线程中发布的所有可能解决方案进行了测试。 然而,在尝试和错误之后,我发现出于任何原因无法识别复杂的密码。

我变了

      mariadb:
        container_name: dev_db
        image: mariadb:10.5
        restart: always
        environment:
          MARIADB_ROOT_PASSWORD: a8Gh@c8wi#gL^
          MARIADB_DATABASE: wp_my_database
          MARIADB_USER: wp
          MARIADB_PASSWORD: a8Gh@c8wi#gL^

经过

      mariadb:
        container_name: dev_db
        image: mariadb:10.5
        restart: always
        environment:
          MARIADB_ROOT_PASSWORD: qwerty
          MARIADB_DATABASE: wp_my_database
          MARIADB_USER: wp
          MARIADB_PASSWORD: qwerty
  • docker 撰写版本:“3.9 ”。
  • 服务:
    • nginx:1.20-高山
    • php:7.2.34-fpm-高山
    • 玛丽亚布:玛丽亚布:10.5
    • phpmyadmin: phpmyadmin/phpmyadmin:最新的。

我找到了更好的方法,无需删除所有卷等。

1 - 更改您的 docker compose 文件以像这样保持 mysql 容器处于活动状态; 在mysql服务下;

command: tail -F anything

此操作后,您可以撤消此操作,不用担心以前的值。

2 - 然后,停止 mysql 容器并运行

docker-compose up --build --force-recreate YOUR_SERVICE_NAME

这不会删除您的卷。

3 - 进入mysql容器;

docker exec -it YOUR_SERVICE_NAME bash

最后按照这样的任何 mysql 重置密码指南进行操作;

https://www.a2hosting.com/kb/developer-corner/mysql/reset-mysql-root-password

我有同样的问题,删除卷后问题仍然存在,然后我找到了这个解决方案:

请记住为 MySQL root 用户设置密码,为此,启动服务器:然后发出以下命令:

/usr/local/mysql/bin/mysqladmin -u root 密码 '新密码' /usr/local/mysql/bin/mysqladmin -u root -h 密码 '新密码'

或者你可以运行:/usr/local/mysql/bin/mysql_secure_installation

也许有点太晚了。 我昨天和今天遇到了同样的问题。
为了解决这个问题,我不得不删除卷(在这个例子中是 db_data)

$docker 卷 ls
$docker 卷 rm db_data

修复它的另一种方法是运行指向新卷的容器(例如 -v db_data2:/var/lib/mysql)

我认为密码存储在卷上,因此它会抱怨。 但是,如 $ls -al db_data 所示,卷为空

不明白为什么不能将空卷挂载到新运行

建议的解决方案都不适合我的情况,但我通过更换解决了同样的问题
PASSWORD=$pecialcharacter$

PASSWORD='$pecialcharacter$'
在 my.env 文件中。 变量中存在 $ 并且变量未用单引号引起来导致我的问题。 希望这对某人有帮助。

我和 mariadb 有同样的问题。 我的解决方案是将 mariadb 映像从10升级到10.8-jammy ,当然是在清理 docker 环境映像并运行容器之后。 我删除了所有内容并做了一个干净的拉动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM