我正在尝试连接在Docker容器中运行的.Net 5api和在单独容器中运行的Postgres db。在没有容器的情况下在本地运行API时,该连接可以正常工作,但是,当我在容器中运行API时,会出现以下错误
连接到服务器'tcp://localhost:5432‘上的数据库'databasename’时出错。
我认为这是因为docker容器没有在localhost上运行。我尝试更改docker-compose文件中的主机,并尝试手动更改startup.cs中的连接字符串。这会更改API在本地运行时使用的连接,但不会更改容器内的连接,也不会更改我收到的错误。任何帮助都将不胜感激。
Startup.cs
//var connectionString = Configuration.GetSection(nameof(PostgresSettings)).Get<PostgresSettings>().ConnectionString;
var connectionString = $"Host=tryingtochangehost;Port=5432;Database=databasename;Username=username;Password=password";
services.AddDbContext<DataContext>(options => options.UseNpgsql(connectionString));
services.AddScoped<IDataContext>(provider => provider.GetService<DataContext>());docker-compose.yml
version: "3.4"
services:
web:
build: .
ports:
- "8080:80"
environment:
- JWTCONFIG:SECRET=secret
- POSTGRESSETTINGS:PASSWORD=password
- POSTGRESSETTINGS:HOST=postgresql_database
depends_on:
- "postgresql_database"
networks:
- mynetwork
postgresql_database:
image: postgres:latest
environment:
- POSTGRES_USER=admin
- POSTGRES_PASSWORD=password
- POSTGRES_DB=databasename
ports:
- "5432:5432"
restart: always
volumes:
- database-data:/var/lib/postgresql/data/
networks:
- mynetwork
pgadmin:
image: dpage/pgadmin4
environment:
- PGADMIN_DEFAULT_EMAIL=pgadmin@admin.org
- PGADMIN_DEFAULT_PASSWORD=password
ports:
- "5050:80"
restart: always
volumes:
- pgadmin:/root/.pgadmin
networks:
- mynetwork
volumes:
database-data:
pgadmin:
networks:
mynetwork:
driver: bridgeDockerfile
FROM mcr.microsoft.com/dotnet/aspnet:5.0-focal AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS build
WORKDIR /src
COPY ["Server.csproj", "./"]
RUN dotnet restore "Server.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "Server.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "Server.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Server.dll"]appsettings.json
{
"PostgresSettings": {
"Host": "localhost",
"Port": "5432",
"Database": "databasename",
"Username": "admin"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtConfig": {},
"AllowedHosts": "*"
}发布于 2021-07-24 07:16:08
当您尝试连接到localhost:5432时,您正在尝试连接到与web容器相同的容器。
Docker compose创建了一个虚拟网络,每个容器都可以通过它的服务名到达。因此,您需要在应用程序设置中将数据库服务器名称从localhost更改为postgresql_database:
{
"PostgresSettings": {
"Host": "postgresql_database",
"Port": "5432",
"Database": "databasename",
"Username": "admin"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtConfig": {},
"AllowedHosts": "*"
}您的连接字符串代码应为
var connectionString = $"Host=postgresql_database;Port=5432;Database=databasename;Username=username;Password=password";发布于 2021-07-24 18:20:24
事实证明我的配置是好的,但是我需要在docker-compose之前运行docker-compose build,这样更改才能真正生效。
https://stackoverflow.com/questions/68507234
复制相似问题