在我的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
我必须让密码为空才能登录。怎么了?
5条答案
按热度按时间nxowjjhe1#
我在mariadb的10.4版本中遇到了这个问题,通过更改到10.3版本来修复。但这个问题可能还有另一个原因。
在Docker架构中,应该注意的是,镜像在第一次构建后是不可变的。也就是说,通过更改docker compose文件中定义的本地变量并重新运行服务或重新uping服务,构建镜像的初始设置不会发生变化。要应用这些更改,必须再次执行构建映像和容器以及运行服务的步骤。这可以如下进行。
1.docker-compose stop(首先停止服务)
2.docker-compose rm(然后我们清理所有相关的容器)
3.docker-compose up --build -d(最后使用--build选项运行服务,以使用新定义的设置重建映像。)
请注意,执行这些步骤将擦除存储在容器内的所有数据。
星期二更新。2023年6月6日
根据https://hub.docker.com/_/mariadb中的“环境变量”部分,当您启动MariaDB镜像时,您可以通过在docker run命令行(或docker compose文件)中传递一个或多个环境变量来调整MariaDB示例的初始化。请注意,如果您使用已经包含数据库的数据目录启动容器,则以下变量都不会有任何影响:任何预先存在的数据库将在容器启动时始终保持不变。
这意味着如果你用一个数据目录启动容器,“MARIADB_ROOT_PASSWORD”环境变量中的任何改变都将产生任何影响。因此,您需要删除数据目录以启动新示例。
pb3skfrl2#
似乎你是从一个现有的db数据目录启动mariadb容器,这将导致使用当前的数据库,而不是初始化一个新的。因此,为了解决这个问题,我建议删除任何现有的mariadb容器,删除当前的db目录内容,再次运行docker compose:
nkoocmlb3#
这是因为您是从容器本身内部本地使用客户端的。本地连接不要求输入密码。
尝试从您的主机连接到Docker
containerip:3306
,然后它会要求输入密码sqougxex4#
MySQL用户由用户名和请求来自的主机定义。例如,有三个 * 不同的用户 *
root@192.168.0.123
、root@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客户端将使用用户root@local
(没有密码)访问mariadb服务器,而不是用户root@%
(之前设置了密码)。因此,如果您想测试为该用户设置密码,请使用以下命令:
MARIADB-CONTAINER-IP是您的mariadb容器的IP地址。(使用Docker检查容器的IP地址)。谢谢
2eafrhcq5#
MYSQL_ROOT_PASSWORD只会在第一次运行给定卷的容器时设置。
使用MYSQL_ROOT_PASSWORD设置密码: