我们可以等待实体框架迁移完成后再在 Docker Compose 中启动容器吗?

问题描述 投票:0回答:1

我正在尝试构建一个 docker-compose.yml 文件,以便使用

asp.net + entity framework migrations + sql server
在本地主机环境中轻松工作。

所以,我的想法是仅使用一个 docker 命令即可轻松启动

compose up --build
但是,问题是
depends_on
允许在实体服务器迁移开始时继续执行容器。但是,我需要等到
entity-framework-migrations
容器和
populate_data_sqlserver
容器完成其工作,然后启动
ApiServer
。我已经知道 docker-compose 在这里无法提供帮助,但我正在寻找一种解决方法以及如何轻松设置它的提示。

启动 Sql Server、然后是迁移、然后是数据填充非常重要,当这 3 个容器准备就绪(1 个运行,另外 2 个停止)时启动 Api 服务器。

在此感谢您的支持。

这是我的 docker-compose.yml 文件:

version: '3.9'

services:
    sql_server:
        image: mcr.microsoft.com/azure-sql-edge
        environment:
            - "ACCEPT_EULA=Y"
            - "SA_PASSWORD=Pa$$W0rd"
        restart: always
        ports:
            - "1433:1433"
        volumes:
            - ./sql_server:/var/lib/sql_server

    entity-framework-migrations:
        build:
            context: ../
            dockerfile: Dockerfile
        depends_on:
            - sql_server
        environment:
            - ConnectionStrings__SQL=Server=sql_server,1433;Persist Security Info=False;User ID=sa;Password=Pa$$W0rd;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=False;;
        command: migrate

    populate_data_sqlserver:
        image: mcr.microsoft.com/mssql-tools:latest
        depends_on:
            - sql_server
            - entity-framework-migrations
            - wait_migrations
        command: /bin/bash -c '/opt/mssql-tools/bin/sqlcmd -S sql_server -U SA -P "Pa$$W0rd" -i /var/lib/sql_server/setup_db.sql -I'
        volumes:
            - ./sql_server:/var/lib/sql_server

    ApiServer:
        image: api-server-product:latest
        build:
            context: ../
            dockerfile: Dockerfile
        environment:
            - ASPNETCORE_URLS=http://+:5000
            - ConnectionStrings__SQL=Server=sql_server,1433;Persist Security Info=False;User ID=sa;Password=Pa$$W0rd;MultipleActiveResultSets=False;Encrypt=False;TrustServerCertificate=False;;
        ports:
            - "5000:5000"
        depends_on:
            - sql_server
            - entity-framework-migrations
            - populate_data_sqlserver
asp.net docker docker-compose entity-framework-core
1个回答
0
投票

Compose“规范”版本有一个扩展版本

depends_on:
,允许它等待另一个容器运行完成。这需要 Compose 工具的版本 2,作为 Docker 插件构建。

所以你应该可以说:

version: '4.x'
services:
  sql_server: { ... }

  entity-framework-migrations:
    depends_on:
      sql_server:
        condition: service_healthy

  populate_data_sqlserver:
    depends_on:
      entity-framework-migrations:
        condition: service_completed_successfully

  ApiServer:
    depends_on:
      populate_data_sqlserver:
        condition: service_completed_successfully

您还可以通过将迁移和种子数据放入主容器中的入口点包装器脚本中来解决此问题。这将使您摆脱支持容器,并让您使用旧版(现在不受支持)的 Compose。不过,这是对此设置的更实质性的改变。 使用 Docker-Compose 时如何执行 Django 数据库迁移? 适用于不同的技术堆栈,但其答案涵盖了几乎所有基于 Docker 的方法。

© www.soinside.com 2019 - 2024. All rights reserved.