我已经使用 Docker compose 通过 ASP.NET Core 8 MVC 应用程序设置了 Docker。根据我的
compose.yaml
,有两个容器,一个用于MySQL数据库(卷),一个用于服务器。我成功地设置了两个容器,并能够使用 docker exec
与 Docker 卷中的数据库进行交互。数据从本地目录中的.sql
加载。
但是,我目前面临的问题是我无法将我的应用程序连接到 Docker 中的数据库。
PS:我的
Dockerfile
是运行docker init
时的默认值。
compose.yaml
services:
database:
image: mysql:latest
ports:
- 3306:3306
volumes:
- ./sql-script:/docker-entrypoint-initdb.d
- datafiles:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
MYSQL_USER: ${USER}
MYSQL_PASSWORD: ${PASSWORD}
MYSQL_DATABASE: ${DB}
server:
build:
context: .
dockerfile: Dockerfile
depends_on:
- database
ports:
- 8080:8080
environment:
- DBHOST=database
- ASPNETCORE_ENVIRONMENT=Development
restart: always
develop:
watch:
- action: rebuild
path: .
volumes:
datafiles:
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<myDatabaseContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("myDatabase") ?? throw new InvalidOperationException("Connection string 'myDatabase' not found.")));
根据我的理解,我仍然不确定Docker如何读取应用程序配置文件。
launchSettings.json
- 此文件仅在开发模式下工作,并且与 Visual Studio 中的播放按钮直接相关。就我而言,这个文件可以忽略。appsettings.json
- 仍然不确定这个,是否接到电话?appsettings.Development.json
- 这就是我的 compose.yaml
的名字。我假设当我定义 ASPNETCORE_ENVIRONMENT=Development
时,这就是加载的文件。目前,我已经在
connectionStrings
中定义了我的appsettings.json
,看起来像这样
"ConnectionStrings": {
"myDatabase" : "Server=localhost,3306; Database=myDb; User=admin; Password=pass;"
}
如果我错了,请纠正,如果我在
ASPNETCORE_ENVIRONMENT=Development
中设置compose.yaml
,这是否意味着所有应用程序配置文件将从appsettings.Devlopment.json
读取,而不是从appsettings.json
读取。
第二个问题:什么时候会调用
appsettings.json
而不是appsettings.Development.json
?我在哪里定义它调用不同配置文件的指令?
您的数据库服务器在环境变量
database
中定义的名为 DBHOST
的主机上运行,但在连接字符串中您尝试连接到 localhost
。改变你的 ConnectionString 它应该可以工作
"ConnectionStrings": {
"myDatabase" : "Server=database,3306; Database=myDb; User=admin; Password=pass;"
}