我正在尝试构建一个 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
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 的方法。