微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?