我的项目使用ASP.NET Core 6.0 Web API连接到Mysql数据库。我已经将它们都停靠了。下面是我的docker-compose.yml
文件,两个服务都连接到同一个网桥。
version: '3.4'
networks:
backend:
services:
mysqldb:
container_name: community-db
image: mysql:8.0
ports:
- 8003:3306
environment:
- MYSQL_DATABASE=dbissues
- MYSQL_ROOT_PASSWORD=****
volumes:
- ./mysql-data:/var/lib/mysql
networks:
- backend
communitycare:
container_name: community-care-app
image: ${DOCKER_REGISTRY-}communitycare
build:
context: .
dockerfile: CommunityCare/Dockerfile
ports:
- 8001:80
depends_on:
- mysqldb
environment:
- DB_HOST=mysqldb
- DB_NAME=dbissues
- DB_ROOT_PASSWORD=****
networks:
- backend
字符串
下面是我的连接字符串,我使用它来连接到ASP.NET Core应用程序中的Mysql数据库。
"DefaultConnection": "Server=mysqldb;Port=3306;Database=dbissues;User=root;Password=****;"
型
我能够用这个连接字符串连接到数据库。我已经使用登录API和swagger进行了测试。
问题是,当我尝试使用此连接字符串运行迁移时,会导致错误:
无法连接到任何指定的MySQL主机(见下图)
Error when running migrations
注意:我可以使用MySQL workbench通过Map的端口8003连接到容器中的Mysql数据库。
奇怪的是,如果我将连接字符串更改为现在使用Map端口(8003)而不是3306,则迁移现在可以运行。
"DefaultConnection": "Server=localhost;Port=8003;Database=dbissues;User=root;Password=****;"
型
但是使用此连接字符串,API无法再连接到Mysql数据库。API只能使用以下方式连接:
"DefaultConnection": "Server=mysqldb;Port=3306;Database=dbissues;User=root;Password=****;"
型
这正常吗?
在使用docker时,是否需要两个不同的连接字符串?一个用于应用迁移,一个用于将API连接到Mysql容器。这有点令人困惑。
此外,当我尝试使用连接字符串将迁移应用到数据库时:
"DefaultConnection": "Server=localhost;Port=8003;Database=dbissues;User=root;Password=****;"
型
(Note:使用其他连接字符串(mysqldb和端口3306,迁移根本不运行,给出无法连接到任何指定的mysql主机错误)
使用:
dotnet ef database update
型
我再次得到一个错误,告诉我一个表已经存在,它失败了。我试图通过MySql工作台删除整个模式,以确保我有一个空的数据库,并再次尝试,但我仍然得到相同的错误:
Error when updating database的
这正常吗?docker-compose是否在运行程序时自动创建表,即使没有向数据库容器应用任何迁移?
按照解决方案中的建议,我还尝试使用以下命令运行数据库更新:
dotnet ef database update --connection "Server=mysqldb;Port=8003;Database=dbissues;User=root;Password=****;"
型
但是我得到相同的错误无法连接到任何指定的MySQL主机
当在应用程序本身中尝试以下迁移时,我得到了下面显示的错误,尽管我刚刚通过MySQL工作台删除了模式。
x1c 0d1x的数据
1条答案
按热度按时间hzbexzde1#
在您的
docker-compose.yml
中字符串
Docker networking
注意HOST_PORT和CONTAINER_PORT之间的区别是很重要的。在上面的例子中,对于db,HOST_PORT是8001,容器端口是5432(postgres默认值)。网络服务到服务的通信使用CONTAINER_PORT。当定义了HOST_PORT时,服务也可以在swarm之外访问。
您的
HOST_PORT
(在本例中为8003
)是网络backend
外部的任何服务必须调用才能访问您的Mysql
数据库。即,您在命令行上通过调用dotnet ef database update
运行的任何迁移只能通过端口8003
访问Mysql
。(Note:使用其他连接字符串(mysqldb和端口3306,迁移根本不运行,给出无法连接到任何指定的mysql主机错误)
备选方案1
您可以保持连接字符串不变,并在命令
dotnet ef database update
中追加参数--connection
,并提供带有端口8003
的连接字符串。使用
备选方案2
在应用程序中运行迁移。
例如
型