我正在尝试对我的整个Web应用程序进行Docker化,而我从后端开始。该服务器是带有PostgreSQL数据库的ASP.Net Core 2.2 Web API。但是,请尽我所能,无法启动后端并运行它。
据我所知,PostgreSQL数据库不是问题。一旦启动,我就可以在本地计算机上访问它,并且可以输入它以确保正确的数据库和用户在那。但是在等待docker-compose运行之后,我仍然从ASP服务器收到以下错误:
Application startup exception: System.AggregateException: One or more errors occurred. (Connection refused) ---> System.Net.Sockets.SocketException: Connection refused
我几乎没有发现有关此错误的信息,尽管有人确实暗示这是由于服务器无法在提供的端口上找到任何东西,但我看不到它是怎么回事。 / p>
Docker-compose.yml
version: '3.7'
services:
webapi:
image: 'webapi'
container_name: 'webapi'
build:
context: .
dockerfile: Dockerfile
environment:
DB_CONNECTION: "Server=postgres;Port=5432;Database=asg;User Id=asgwebapi;Password=admin;"
ports:
- "5000:5000"
depends_on:
- postgres
networks:
- webapp-network
postgres:
image: postgres
container_name: 'postgres'
environment:
POSTGRES_USER: "asgwebapi"
POSTGRES_PASSWORD: "admin"
POSTGRES_DB: "asg"
ports:
- "5432:5432"
networks:
- webapp-network
networks:
webapp-network:
driver: bridge
服务器的Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY Core/Core.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish Core/Core.csproj -c Release -o out
# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS runtime
WORKDIR /app
COPY --from=build /app/Core/out .
ENTRYPOINT ["dotnet", "Core.dll"]
我在服务器上使用Npgsql,这就是为什么要这样设置连接字符串的原因。对于“服务器”字段应设置为什么,我仍然有些困惑。大多数示例都将其设置为与Postgres容器的名称相同,但这对我没有任何问题。而且,虽然我不一定需要从主机连接到Postgres容器,但我知道除非“ Server”设置为localhost,否则我无法这样做。
服务器在启动时立即失败,因为它正在寻找要用测试数据填充的数据库并运行迁移,但是它始终会出现相同的“连接被拒绝”错误,我无法解决。目前,我可以通过以下方式通过cli使用Postgres:
docker exec -it postgres psql dbname=asg asgwebapi
,我也可以连接到数据库并在本地运行服务器,而不会出现问题。因此,即使是问题,也不知道为什么服务器的Docker容器找不到它。
答案 0 :(得分:0)
我们在评论中发现Web服务器容器再次开始工作。我们推测定制网络可能出了故障。
容器的一个好的经验法则是,如果它们都在Docker Compose文件中的同一网络中,则它们可能不需要在自定义网络中。默认情况下,Docker Compose会将所有容器放在同一网络上,并且它们可以使用匹配其服务名称的自动DNS条目彼此联系。
如果您希望某些或所有服务只能看到其他服务的一个子集(或根本看不到),则自定义网络最有用。出于安全原因,这可能很有用。
您还可以创建非标准类型的网络,但是大多数用户不需要这些。更多信息is available in the manual。