Docker不设置MariaDB密码

6l7fqoea  于 2023-06-22  发布在  Docker
关注(0)|答案(5)|浏览(154)

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

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

nxowjjhe

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”环境变量中的任何改变都将产生任何影响。因此,您需要删除数据目录以启动新示例。

pb3skfrl

pb3skfrl2#

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

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

nkoocmlb3#

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

sqougxex

sqougxex4#

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客户端将使用用户root@local(没有密码)访问mariadb服务器,而不是用户root@%(之前设置了密码)。
因此,如果您想测试为该用户设置密码,请使用以下命令:

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

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

2eafrhcq

2eafrhcq5#

MYSQL_ROOT_PASSWORD只会在第一次运行给定卷的容器时设置。
使用MYSQL_ROOT_PASSWORD设置密码:

    • 选项1**:删除旧的DB文件并重新开始。
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:

相关问题