我在 dotnet core 2.1 中有一个非常简单的应用程序,它与 MySQL 数据库通信。该应用程序使用这样的 Entity Framework :
var connectionString = Configuration.GetConnectionString("DatabaseConnection");
services.AddDbContext<ChtrDbContext>(options => options.UseMySql(connectionString));
连接字符串如下所示:
"DatabaseConnection": "Server=db;port=3306;Database=chtr;userid=dbuser;Password=dbuserpassword"
该应用程序已进行 Docker 化,我使用 docker-compose up --build 来启动环境。
当我导航到 localhost:8080/graphql(这是我的 GraphiQL 端点)并尝试对数据库进行简单查询时,我无法登录。这是日志文件:
Access denied for user 'dbuser'@'172.19.0.3' (using password: YES)
chtr.server_1 | at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 360
它说 dbuser (配置的用户)没有访问我的数据库的权限。
运行docker ps
,其中列出了我的所有容器,我可以看到 mysql 容器正在运行。然后我再次运行 docker inform chtrserver_db_1 ,这是容器名称。向下滚动到此 json 文件的“配置”部分会显示以下内容:
"Env": [
"MYSQL_RANDOM_ROOT_PASSWORD=1",
"MYSQL_DATABASE=chtr",
"MYSQL_USER=dbuser",
"MYSQL_PASSWORD=dbuserpassword",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.7",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.26-1debian9"
],
好吧,我已经确认 docker 容器正在运行,并且连接字符串中指定的凭据等于容器中配置的凭据。为什么我还是无法登录?
docker-compose.yml 文件如下所示:
版本:'3.0'
services:
db:
image: mysql:5.7
environment:
MYSQL_RANDOM_ROOT_PASSWORD: 1
MYSQL_DATABASE: chtr
MYSQL_USER: dbuser
MYSQL_PASSWORD: dbuserpassword
volumes:
- dbdata:/var/lib/mysql
- ./Scripts:/docker-entrypoint-Dataseed.d
restart: always
chtr.server:
depends_on:
- db
image: trebias/chtr.server
build:
context: .
ports:
- "8080:80"
volumes:
dbdata:
关于如何继续前进有什么建议吗?
最佳答案
您是否 100% 确定凭据与 MySQL 上的用户匹配?请注意,MYSQL_USER 和 MYSQL_PASSWORD 仅在第一次创建数据库时使用一次,因此如果您在保留数据库的同时更改了它们,那么您关于凭据的 ENV 变量与数据库中的变量匹配的假设就不再成立。
如果是这种情况,那么您可以删除数据库并重新开始。由于您使用的是命名卷,因此需要手动删除它(使用 rm 命令时,docker rm 永远不会删除命名卷,只会删除匿名卷)。
要删除命名卷,您可以使用以下命令:
docker volume rm xxxx_dbdata
其中 xxxx 应该是您的项目名称(撰写文件所在的目录)。您还可以通过执行dockervolume ls
来查看docker卷的列表。
关于c# - 在 docker 中连接到 MySQL 实例时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56117123/