c# - 在 docker 中连接到 MySQL 实例时出错

标签 c# mysql docker .net-core docker-compose

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

相关文章:

Docker 从 env_file 而不是默认的 .env 文件组成 extra_hosts

c# - 捕获滚动​​窗口内容屏幕截图

c# - SendMessage 消失在以太中

c# - OPC UA .NET 客户端 - 使用浏览路径获取 OPCUA 节点 ID

c# - 使用 Entity Framework 进行多对多对多

php - php中的POST radio 类型值

c# - DataGridView 在排序时崩溃?

mysql - 移动到新域后 Magento URL 不起作用

docker-compose up 问题使用 Docker Apple M1

scala - 如何使用 Docker 安装 Actor Platform