繁体   English   中英

docker 容器中的服务器无法连接到另一个 docker 容器中的 postgres 数据库

[英]Server in docker container unable to connect to postgres database in another docker container

我有一个节点服务器正在尝试使用knex连接到 postgres 数据库。 两者都在具有相同自定义网络的 docker 容器中。 我不断收到 ECONNREFUSED 错误。 我在数据库容器中四处寻找,发现我的数据库( test_db )是由 psql 创建的,但它没有权限。 授予root权限后,我仍然遇到同样的问题。 我尝试使用docker-compose down -v删除卷,但仍然没有运气。 我也试过删除 knex 并只使用node-postgres但同样的错误。 我也无法使用 pgadmin 从主机连接到 Db。 将不胜感激任何帮助!

这是我的 docker-compose.yml

version: "3"

services:
  server:
    build:
      context: .
      dockerfile: development.Dockerfile
    ports:
      - "8081:8081"
    volumes:
      - .:/src
      - /src/node_modules
    networks:
      - dev-network
    environment:
      DB_HOSTNAME: pg-development
      DB_USER: root
      DB_PASSWORD: helloworld
      DB_PORT: 3306
      DB_NAME: test_dev
    depends_on:
      - pg-development
  pg-development:
    image: postgres
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: helloworld
      POSTGRES_DB: test_dev
    ports:
      - "3308:3306"
    volumes:
      - dbdata:/data/db
    networks:
      - dev-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U root -d test_dev"]
      interval: 10s
      timeout: 2s
      retries: 10
networks:
  dev-network:
    driver: bridge

volumes:
  dbdata:

这是我的数据库连接

import knex from "knex";

const connection = {
  host: process.env.DB_HOSTNAME,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  port: Number(process.env.DB_PORT),
  database: process.env.DB_USER,
};

const db = knex({
  client: "pg",
  connection,
  debug: true,
  pool: {
    min: 0,
    max: 50,
    afterCreate: function (conn, done) {
      conn.query('SET timezone="UTC";', function (err) {
        if (err) {
          done(err, conn);
        }
      });
    },
  },
});

我是因为您在pg-development容器中暴露了错误的端口:

https://docs.docker.com/compose/reference/port/

port [options] SERVICE PRIVATE_PORT

您在数据库中公开的端口是3308端口,正确的配置应该是:

...
ports:
      - "3306:3306"
...

这不起作用的原因是因为数据库实际上是在默认的 postgres 端口 5432 上启动的。在 docker-compose.yml 中,您需要添加一个命令来更改默认端口。

pg-development:
    image: postgres
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: helloworld
      POSTGRES_DB: test_dev
    ports:
      - "3308:3306"
    volumes:
      - dbdata:/data/db
    networks:
      - dev-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U root -d test_dev"]
      interval: 10s
      timeout: 2s
      retries: 10
    command: -p 3306 // this fixes the issue

这在 docker-compose 中对我有用,其中一个容器是 postgresqldb,另一个容器是 .net 核心 3.1 容器。

#docker-compose.yml
version: '3.4'

services:

    customerdb:
        image: postgres

    customer.api:
        image: ${DOCKER_REGISTRY-}customerapi
        build:
            context: .
            dockerfile: Customer/Customer.API/Dockerfile

docker-compose.override.yml

customerdb:
    container_name: customerdb
    image: postgres
    restart: always
    environment:
        POSTGRES_PASSWORD: postgres
        POSTGRES_DB: postgres
        POSTGRES_USER: postgres
    ports:
        - 5100:5432
    volumes:
        - ./postgres-data1:/var/lib/postgresql/data 

customer.api:
    container_name: customerapi
    environment:
        - ASPNETCORE_ENVIRONMENT=Development
        - "ConnectionStrings:CustomerConnection=host=host.docker.internal;port=5100;database=CustomerDB;username=postgres;password=postgres"
    depends_on:
        - customerdb
    volumes:
        - ${HOME}/.microsoft/usersecrets/:/root/.microsoft/usersecrets
        - ${HOME}/.aspnet/https:/root/.aspnet/https
    ports:
        - "8000:80"

我使用 ConnectionStrings:CustomerConnection=host=... 因为我曾经使用 app.config 来获取连接字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM