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,)]
它似乎也没有问题。
我正在使用 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,)]
它似乎也没有问题。