Docker没有设置MariaDB密码。

8

在我的 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 

我必须让密码为空才能登录。有什么问题吗?


1
你能解释一下“我必须让密码为空才能登录”的意思吗? - Mike Doe
如果有一个答案对您有帮助,请您标记其中一个答案为已采纳,以此来结束您的问题。您可以通过点击您选择的答案旁边的勾选标记来进行操作。 - zedfoxus
5个回答

8
我在mariadb的10.4版本中遇到了这个问题,通过切换到10.3版本解决了。但是这个问题可能还有其他原因。
在Docker架构中,需要注意的是,镜像在第一次构建后是不可变的。也就是说,通过更改docker compose文件中定义的本地变量并重新运行服务或重新启动服务,不会对构建镜像的初始设置产生任何更改。要应用这些更改,必须再次执行构建镜像、容器和运行服务的步骤。可以按照以下方式进行操作:
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"环境变量的任何更改都不会产生任何效果。因此,您需要删除数据目录以启动一个全新的实例。

3
您可能还需要删除附加到容器的持久卷(如果有的话)。 docker volume lsdocker volume rm VOLUME_NAME - Davey
2
docker compose downdocker volume rm VOLUME_NAME 对我来说已经足够了。 - Niv

2

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

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

1
那是因为您正在从容器内部本地使用客户端。本地连接不需要密码。 尝试从主机计算机连接到Docker containerip:3306,然后它会要求输入密码。

1

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

如果在docker-compose文件中设置了MYSQL_ROOT_PASSWORD环境变量,则您的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 inspect命令检查容器的IP地址)。谢谢。

0

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:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接