ASP.NET Core EF命令:无法连接到任何指定的MySQL主机

更新:发现,我有一个Dockerfile的责任误解。 当一个容器被构build时,完全的networking是不可行的。 总之,最好的做法似乎是在一个容器中应用迁移,稍后将其移除。 我想多写一点,稍后会给出更详细的答案。

我正在基于Jenkins的基于MySQL的数据库(MariaDB)的ASP.NET核心应用程序CI部署。 应用程序内部的MySQL Connection for Entity Framework Core工作,例如用于ASP.NET Core Identity。 当我尝试使用dotnet ef database update应用数据库迁移时,我总是得到以下exception:

MySql.Data.MySqlClient.MySqlException:无法连接到任何指定的MySQL主机。

听起来像是连接问题,但事实并非如此:当我运行我的应用程序没有迁移,我看到ASP.NET核心可以查询数据库,并给我例外,表不存在。 我也使用VPN迁移到SQL服务器容器:Works。 我甚至在托pipeASP.NET Core应用程序的Container上安装了MySQL cmd客户端,并与它们连接,也起作用:

 root@efc609a9a9aa:/app/test/test# dotnet ef database update -e Development Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:04.56 CONNECTIONSTRING = Server=mariadb; Database=test; Uid=root; Pwd=test; MySql.Data.MySqlClient.MySqlException: Unable to connect to any of the specified MySQL hosts. [...] root@efc609a9a9aa:/app/test/test# mysql -u root -h mariadb -ptest Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 10 Server version: 5.5.5-10.1.23-MariaDB-1~jessie mariadb.org binary distribution Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 

我的环境的结构

Dockerfile

 FROM microsoft/aspnetcore-build:1.1.1 env APP_NAME Test ADD . /app WORKDIR /app/$APP_NAME RUN dotnet restore RUN dotnet ef dbcontext scaffold "Server=mariadb; Database=test; Uid=root; Pwd=test;" "Pomelo.EntityFrameworkCore.MySql" WORKDIR /published/ ENTRYPOINT dotnet ${APP_NAME}.dll 

泊坞窗,compose.yml

 version: "2" services: app: image: app-image container_name: app mem_limit: 512MB # restart: always volumes: - .:/app environment: - "TZ=Europe/Berlin" depends_on: - mariadb build: context: . mariadb: image: mariadb:latest container_name: app-mariadb mem_limit: 512MB restart: always env_file: - .env 

ASP.NET核心应用程序

为了找出问题,我创build了一个空的ASP.NET Core项目,并将这些包添加到了csproj文件中:

 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp1.1</TargetFramework> </PropertyGroup> <ItemGroup> <Folder Include="wwwroot\" /> </ItemGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="1.1.1" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="1.1.2" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="1.1.1" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" /> </ItemGroup> <ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql.Design" Version="1.1.2" /> </ItemGroup> </Project> 

然后添加一个testing上下文

 public class AppDbContext : DbContext { public DbSet<TestEntity> TestEntitys { get; set; } public AppDbContext(DbContextOptions options) : base(options) { } public AppDbContext() {} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder .UseMySql(@"Server=mariadb; Database=test; Uid=root; Pwd=test;"); } public class TestEntity { public int Id { get; set; } public string Name { get; set; } } 

在项目文件夹中,我首先创build一个数据库服务器的实例,当我的应用程序尝试使用它时,100%确定它已经启动。 然后Dockerfile被编译

 docker-compose up -d mariadb docker-compose build --no-cache myapp