如何解决在 Docker 容器中运行 .Net 5 API 时无法连接到 Postgres
我正在尝试将在 Docker 容器中运行的 .Net 5 API 与在单独容器中运行的 Postgres 数据库连接起来。在没有容器的情况下在本地运行 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: bridge
Dockerfile
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": "*"
}
解决方法
当您尝试连接到 // types.ts
export interface LocationParams<Data> {
pathname: string;
state: Data;
search: string;
hash: string;
key: string;
}
// App.tsx
import { LocationParams } from './types.ts'
// ...
const location = useLocation<LocationParams<your_data_here>>()
时,您正在尝试连接到与您的网络容器相同的容器。
Docker compose 创建了一个虚拟网络,其中每个容器都可以通过其服务名称访问。因此,您需要在您的应用设置中将数据库服务器名称从 localhost:5432
更改为 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": "*"
}
,
事实证明我的配置很好,但是我需要在 docker-compose up 之前运行 docker-compose build,这样更改才能真正生效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。