Maria DB docker 用户 'root'@'localhost' 的访问被拒绝

Maria DB docker Access denied for user 'root'@'localhost'

我正在使用 MariaDB docker 图像并不断收到警告:

[Warning] Access denied for user 'root'@'localhost' (using password: NO)

这是我用来创建图像的 docker 文件:

FROM mariadb:10.6.4
ENV MYSQL_ROOT_PASSWORD pw
ENV MARIADB_DATABASE db1
ENV MARIADB_USER user1
ENV MARIADB_PASSWORD user1pw

我在 docker-compose 中启动容器:

mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.
    ports:
      - 2306:3306  

并且我使用以下方法从另一个容器访问该容器:

mysql+pymysql://user1:user1pw@mariadb_container:3306/db1

找到的大多数解决方案 google 都是 运行 某种 SQL 语句,但由于我是 运行 一个 docker 容器,我需要一个临时解决方案。 任何人都知道如何在 docker?

中解决这个问题

-----编辑-----

我忘记将健康检查部分添加到 dockercompose 文件中:

mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.
    ports:
      - 2306:3306  
    healthcheck:
      test: ["CMD-SHELL", 'mysqladmin ping']
      interval: 10s
      timeout: 2s
      retries: 10

更新

根据对您问题的更新,您正在尝试 运行 容器内的 mysqladmin ping 命令。 mysqladmin 正在尝试以 root 用户的身份进行连接,但对您的数据库服务器进行身份验证需要密码。

您可以通过以下方式向 mysqladmin 提供密码:

  • 使用 -p 命令行选项
  • 使用 MYSQL_PWD 环境变量
  • 正在创建凭据文件

如果我们将 root 密码移出您的映像,而不是将其设置在 运行 时间,我们可以像这样编写您的 docker-compose.yml 文件:

version: "3"

services:
  mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.
    environment:
      - "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"
      - "MYSQL_PWD=$MYSQL_ROOT_PASSWORD"
    healthcheck:
      test: ["CMD-SHELL", 'mysqladmin ping']
      interval: 10s
      timeout: 2s
      retries: 10

然后在我们的 .env 文件中我们可以设置:

MYSQL_ROOT_PASSWORD=pw1

现在容器启动后我们看到容器是 健康:

$ docker ps
CONTAINER ID   IMAGE            COMMAND                  CREATED          STATUS                    PORTS      NAMES
c1c9c9f787e6   mariadb_image    "docker-entrypoint.s…"   28 seconds ago   Up 27 seconds (healthy)   3306/tcp   mariadb_container

附带说明一下,从这个例子中并不清楚您为什么要构建自定义图像:最好在 运行 时设置环境变量,而不是使用“baked”创建图像-in”凭据。


上一个回答

使用 mysql 客户端或 Python 代码时,我无法重现您的问题。鉴于以下 docker-compose.yml

version: "3"

services:
  mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.

  shell:
    image: mariadb:10.6.4
    command: sleep inf

(目录 topcat_mariadb 包含来自您的 Dockerfile 问题。)

如果我执行到 shell 容器:

docker-compose exec shell bash

和运行 mysql像这样:

mysql -h mariadb_container -u user1 -p db1

它工作得很好:

root@4fad8e8435df:/# mysql -h mariadb_container -u user1 -p db1
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.6.4-MariaDB-1:10.6.4+maria~focal mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [db1]>

看起来您可能正在使用 sqlalchemy。如果我添加一个 Python 容器 混合:

version: "3"

services:
  mariadb:
    restart: always
    image: mariadb_image
    container_name: mariadb_container
    build: topcat_mariadb/.

  shell:
    image: mariadb:10.6.4
    command: sleep inf

  python:
    image: python:3.9
    command: sleep inf

然后 运行 python 容器中的以下 Python 代码:

>>> import sqlalchemy
>>> e = sqlalchemy.engine.create_engine('mysql+pymysql://user1:user1pw@mariadb_container:3306/db1')
>>> res = e.execute('select 1')
>>> res.fetchall()
[(1,)]

它似乎也没有问题。