【问题标题】:Database connection error while using .net core and mysql in docker在 docker 中使用 .net core 和 mysql 时出现数据库连接错误
【发布时间】:2020-03-08 11:36:21
【问题描述】:

我在带有 MySQL 数据库的 .net 核心中有一个简单的 Web API 应用程序,它在没有 docker 的情况下也可以在本地工作。我有windows 10 Home edition,不能直接使用docker,必须使用VirtualBox才能使用docker。

应用设置

"DatabaseConfig": {
    "Server": "db",
    "Port": "3306",
    "Database": "CoreApiDatabase",
    "User": "root",
    "Password": "27101376"
  }

配置服务

var server = Configuration["DatabaseConfig:Server"];
var port = Configuration["DatabaseConfig:Port"];
var database = Configuration["DatabaseConfig:Database"];
var user = Configuration["DatabaseConfig:User"];
var password = Configuration["DatabaseConfig:Password"];

services.AddDbContext<ApplicationDbContext>(options =>
options.UseMySql($"server={server}; userid={user}; pwd={password}; port={port}; database={database}"));

在startup.cs 的Configure 方法中迁移和植入数据库

Dockerfile

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 
WORKDIR /app
EXPOSE 80
COPY --from=build-env app/out .
ENTRYPOINT [ "dotnet","CoreApiDatabase.dll" ]

Docker-compose.yml

version: "3"

services:
  db:
    image: mysql
        ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 27101376
    networks:
      - default

  coreapidatabase:
    image: saeedgz98/coreapidatabase
    build:
      context: .
      dockerfile: Dockerfile
    links:
      - db:db
    ports:
      - 8001:80
    restart: always

最后,在运行命令 docker-compose up 时,我在执行和执行迁移时遇到此错误。

【问题讨论】:

  • 您是否尝试将连接字符串中的database= 替换为schema=
  • 我还尝试将 .json 中的 "Server": "db" 行替换为 "Server": "localhost",因为我找不到暗示 db 指的是正确的服务器的线索。
  • 是并得到“System.ArgumentException: Option 'schema' not supported”错误

标签: mysql docker .net-core docker-compose


【解决方案1】:

我在使用 root 用户设置 mysql 并在某个远程机器上运行它时运气不佳。 MySQL 有一些严格的权限要求 root@localhost 与 root@127.0.0.1 不同。或者这就是我无法理解的。如果您发现其他情况,请分享。

只是想在这里提供帮助。切换到另一种连接字符串形式

appsettings.json

"server=<database name from docker-compose >;port=3306;userid=<database owner>;password=<owner password>;database=<database name>;"

docker-compose 可能如下所示:

docker-compose.yaml

version: '3.3'
services:
  moviedb:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: <root password>
      MYSQL_DATABASE: <database name>
      MYSQL_USER: <database owner>
      MYSQL_PASSWORD: <owner password>

码头文件

避免编写自定义 dockerfile。使用 Visual Studio 创建的文件并修改该文件。

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["<project relative path>", "<project name>/"]
RUN dotnet restore "<project relative path>"
COPY . .
WORKDIR "/src/<project name>"
RUN dotnet build "<csproj name>" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "<csproj name>" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "<project dll name>"]

你也可以在下面运行docker命令,尝试登录数据库服务器

调试提示:

docker-compose up
docker ps
docker exec -it <sql container id> bash

一旦进入容器。运行下面的mysql命令:

mysql -u <owner name> -p 
<owner password>
SHOW DATABASES; 
USE <database name>; 
SHOW TABLES;

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2019-10-09
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多