Ошибка подключения к базе данных при использовании. net core и mysql in docker - PullRequest
0 голосов
/ 08 марта 2020

У меня есть простое приложение веб-API в ядре net с базой данных MySQL, и оно работает локально без docker. У меня windows 10 Home edition и я не могу использовать docker напрямую, и мне нужно использовать VirtualBox для использования docker.

Appsettings

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

ConfigureServices

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}"));

миграция и заполнение базы данных в методе Configure в startup.cs

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 Я получаю эту ошибку при выполнении и выполнении миграций .

enter image description here

1 Ответ

0 голосов
/ 09 марта 2020

Мне очень повезло: я настроил mysql с пользователем root и запустил его на какой-то удаленной машине. 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 -композиция может выглядеть следующим образом:

docker -композиция. 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

Избегайте записи пользовательских 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; 

Надеюсь, это поможет.

...