首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Docker容器中运行.Net 5API时无法连接到Postgres

在Docker容器中运行.Net 5API时无法连接到Postgres
EN

Stack Overflow用户
提问于 2021-07-24 13:26:02
回答 2查看 107关注 0票数 0

我正在尝试连接在Docker容器中运行的.Net 5api和在单独容器中运行的Postgres db。在没有容器的情况下在本地运行API时,该连接可以正常工作,但是,当我在容器中运行API时,会出现以下错误

连接到服务器'tcp://localhost:5432‘上的数据库'databasename’时出错。

我认为这是因为docker容器没有在localhost上运行。我尝试更改docker-compose文件中的主机,并尝试手动更改startup.cs中的连接字符串。这会更改API在本地运行时使用的连接,但不会更改容器内的连接,也不会更改我收到的错误。任何帮助都将不胜感激。

Startup.cs

代码语言:javascript
复制
//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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "PostgresSettings": {
    "Host": "localhost",
    "Port": "5432",
    "Database": "databasename",
    "Username": "admin"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "JwtConfig": {},
  "AllowedHosts": "*"
}
EN

回答 2

Stack Overflow用户

发布于 2021-07-24 07:16:08

当您尝试连接到localhost:5432时,您正在尝试连接到与web容器相同的容器。

Docker compose创建了一个虚拟网络,每个容器都可以通过它的服务名到达。因此,您需要在应用程序设置中将数据库服务器名称从localhost更改为postgresql_database

代码语言:javascript
复制
{
  "PostgresSettings": {
    "Host": "postgresql_database",
    "Port": "5432",
    "Database": "databasename",
    "Username": "admin"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "JwtConfig": {},
  "AllowedHosts": "*"
}

您的连接字符串代码应为

代码语言:javascript
复制
var connectionString = $"Host=postgresql_database;Port=5432;Database=databasename;Username=username;Password=password";
票数 1
EN

Stack Overflow用户

发布于 2021-07-24 18:20:24

事实证明我的配置是好的,但是我需要在docker-compose之前运行docker-compose build,这样更改才能真正生效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68507234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档