Docker没有设置MariaDB密码



In my docker-compose.yml

version: '3'
services:
db:
image: mariadb:latest
volumes:
- ./dc_test_db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: secret

当我通过以下方式连接时:

sudo docker exec -it docker_db_1 mysql -u root -p 

我必须让密码为空才能登录。怎么了?

我在 mariadb 的 10.4 版中遇到了这个问题,通过更改为 10.3 版修复了这个问题。 但是这个问题可能还有另一个原因。

在 Docker 架构中,应该注意的是,映像在第一次构建后是不可变的。也就是说,通过更改 docker 撰写文件中定义的局部变量并重新运行服务或重新更新服务,构建映像的初始设置不会发生任何更改。若要应用这些更改,必须再次执行生成映像和容器以及运行服务的步骤。可以按如下方式完成。

1.docker-compose stop(首先我们停止服务(

2.docker-compose rm(然后我们清理所有相关容器(

3.docker-compose up --build -d(最后使用 --build 选项运行服务,以使用新定义的设置重建映像。

请注意,执行这些步骤将擦除存储在容器内的所有数据。

周二的新更新。六月 6, 2023.

根据 https://hub.docker.com/_/mariadb 中的"环境变量"部分 启动 MariaDB 映像时,您可以通过在 docker 运行命令行(或 docker 撰写文件中(传递一个或多个环境变量来调整 MariaDB 实例的初始化。请注意,如果使用已包含数据库的数据目录启动容器,则以下变量都不会产生任何影响:任何预先存在的数据库在容器启动时将始终保持不变。

这意味着,如果使用数据目录启动容器,"MARIADB_ROOT_PASSWORD"环境变量中的任何更改都会产生任何影响。 因此,您需要删除数据目录才能启动新实例。

您似乎正在从现有的数据库数据目录启动 mariadb 容器,这将导致使用当前数据库而不是初始化新数据库。因此,为了解决这个问题,我建议删除任何现有的mariadb容器,删除当前的db目录内容,再次运行docker compose:

$ docker-compose down -v
$ rm -Rf dc_test_db/*
$ docker-compose up -d

这是因为您是从容器本身内部本地使用客户端的。本地连接不要求输入密码。

尝试从主机连接到 dockercontainerip:3306然后它会要求输入密码

MySQL用户由请求来自的用户名和主机定义。例如,有三种不同的用户root@192.168.0.123root@localhost和通配符root@%

如果您在 docker-compose 文件中设置MYSQL_ROOT_PASSWORD env,您的 mariadb 将为用户root@%设置密码,而不是为用户root@localhost设置密码。

但是当你尝试测试mariadb的密码时,你使用sudo docker exec -it docker_db_1 mysql -u root -p命令,这意味着容器中的mariadb-client将使用用户root@local(没有密码(来访问mariadb-server,而不是用户root@%(有你之前设置的密码(。

因此,如果要测试为该用户设置的密码,请使用以下命令:

docker run -it mariadb mysql -u root -h MARIADB-CONTAINER-IP -p

MARIADB-CONTAINER-IP 是您的 mariadb 容器的 IP 地址。使用 docker 检查检查容器的 IP 地址(。 谢谢。

MYSQL_ROOT_PASSWORD只会在第一次以给定卷运行容器时设置。

要使用MYSQL_ROOT_PASSWORD设置密码:

选项1:删除旧的数据库文件并重新开始。

rm -rf ./dc_test_db

选项 2:使用命名卷:

version: '3.5'
services:
db:
image: mariadb:latest
volumes:
- dc_test_db:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
dc_test_db:

最新更新