基于eShopOnContainers学习ASP.NET Core之使用作为容器运行的数据库服务器

前言

可以将数据库放在常规的服务器上、云上等地方, 但对于开发环境和测试环境而言可以将数据库作为容器运行,因为其没有任何的外部依赖,更加方便测试,直接通过种子数据初始化其中的数据更容易察觉测试中的问题

本文主要参考

官方示例使用作为容器运行的数据库服务器

当前docker-compose配置文件

image

其中

docker-compose.yml和docker-compose.override.yml用于示例程序的配置

docker-compose-build用于还原nuget和编译发布的配置

docker-compose-pod.yml和docker-compose-pod.override.yml用于生产环境的动静配置

所以作为容器运行的数据库服务器,主要配置在docker-compose.yml和docker-compose.override.yml中

mysql 作为包含微服务相关数据库的容器运行

修改原来的docker-compose.yml

version: '3.4'

services:
  systeminfo.api:
    image: ${DOCKER_REGISTRY-}systeminfoapi
    build:
      context: .
      dockerfile: src/Services/SystemInfo/SystemInfo.Api/Dockerfile
    depends_on:
      - sqldata
  sqldata:
    image: mysql:8.0.26

docker-compose.override.yml文件为

version: '3.4'

services:
  systeminfo.api:
    environment:
      - ConnectionString=${SYSTEMINFO_DB}
    ports:
      - 5001:80
      - 5000:443
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - D:/docker-logs/systeminfo:/app/logs/
  sqldata:
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=zhao56
    restart: always

.env环境变量配置

SYSTEMINFO_DB=server=sqldata;user=root;password=zhao56;database=zhao56
DOCKER_REGISTRY=zhao56

在 Web 应用程序启动时设定测试数据

官网的是程序启动的时候加载种子数据,但是这种的话个人感觉还是不太好,经查阅资料还是决定启动的时候根据配置来决定是否迁移如下

appsetting.json中添加

{
  "AllowedHosts": "*",
  //用于mysql指定版本
  "DbVersion": "8.0.26",
   //是否生成种子数据
  "NeedMigrations": true,
  "ConnectionStrings": {
    "ConnectionString": "server=sqldata;user=root;password=root;database=zhao56"
  }
}

注册DbContexts的服务的时候,读取配置是否通过迁移的dbcontext生成database及种子数据

public static void AddDbContexts(this IServiceCollection services)
{
    if (Bootstrap.ConfigurationManager.NeedMigrations)
    {
        var builderDb = new DbContextOptionsBuilder<SystemInfoContext>();
        builderDb.UseMySql(Bootstrap.ConfigurationManager.DbConnectionString, new MySqlServerVersion(new Version(Bootstrap.ConfigurationManager.DbVersion)));
        using (var context = new MigrationSystemInfoContext(builderDb.Options))
        {
            context.Database.Migrate();
        }
    }
    services.AddDbContext<SystemInfoContext>(
        options => options.UseMySql(Bootstrap.ConfigurationManager.DbConnectionString, new MySqlServerVersion(new Version(Bootstrap.ConfigurationManager.DbVersion))));
}

最后上结果

image

image

posted @ 2021-08-06 14:55  zhao56  阅读(69)  评论(0编辑  收藏  举报