无法使用Docker从Node.js连接到Postgres

时间:2020-06-14 07:25:48

标签: node.js docker docker-compose typeorm

我在使用nodejs和docker连接到postgres时遇到问题。它给我以下错误:

 Error: getaddrinfo ENOTFOUND db db:5432

这是我的docker compose文件:

version: '3.5'
services:
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./
    depends_on:
      - db
    ports:
      - '${NODE_PORT}:${NODE_PORT}'
    environment:
      DB_HOST: ${DB_HOST}
      DB_PORT: ${DB_PORT}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      DB_DATABASE: ${DB_DATABASE}
      NODE_HOST: ${NODE_HOST}
      NODE_PORT: ${NODE_PORT}
    volumes:
      - ./src:/usr/src/app/src

  db:
    image: postgres:11
    build:
      dockerfile: Dockerfile.dev
      context: ./database
    container_name: pgsql
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE}
    volumes:
      - ./database/schema/base.sql:/docker-entrypoint-initdb.d/0.schema.sql
      - ./database/schema/tables.sql:/docker-entrypoint-initdb.d/1.tables.sql
      - ./database/schema/grant.sql:/docker-entrypoint-initdb.d/2.grant.sql
      - ./database/fixtures/basics.sql:/docker-entrypoint-initdb.d/3.basics.sql
      - ./database/fixtures/relations.sql:/docker-entrypoint-initdb.d/4.relations.sql
    ports:
      - '${DB_PORT}:5432'
    networks:
      - postgres
    restart: unless-stopped

networks:
  postgres:
    driver: bridge

我使用以下环境变量进行调用:

DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE=prpp
DB_HOST=db
DB_PORT=5432
NODE_PORT=3003
NODE_HOST=0.0.0.0
NODE_ENV=dev

尝试与TypeOrm建立连接时出现以下错误:

public async init(): Promise<void> {
    console.log('init', this.app.locals);
    try {
        this.connection = await createConnection({
            type: 'postgres',
            host: this.app.locals.DB_HOST,
            port: this.app.locals.DB_PORT,
            username: this.app.locals.DB_USERNAME,
            password: this.app.locals.DB_PASSWORD,
            database: this.app.locals.DB_DATABASE,
            entities: [resolve(__dirname, '..', 'api/**/*.model.{ts,js}')],
            logging: false,
        });
    } catch (err) {
        console.error(err);
    }
}

这是我从容器中得到的输出:

api_1  | init { PORT: 3003,
api_1  |   DB_USERNAME: 'postgres',
api_1  |   DB_PASSWORD: 'postgres',
api_1  |   DB_DATABASE: 'prpp',
api_1  |   DB_HOST: 'db',
api_1  |   DB_PORT: 5432,
api_1  |   env: 'dev' }
api_1  | Here 3003 dev
api_1  | Server starting on 3003
api_1  | { Error: getaddrinfo ENOTFOUND db db:5432
api_1  |     at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:58:26)
api_1  |   errno: 'ENOTFOUND',
api_1  |   code: 'ENOTFOUND',
api_1  |   syscall: 'getaddrinfo',
api_1  |   hostname: 'db',
api_1  |   host: 'db',
api_1  |   port: 5432 }

但是如果我从

替换主机
this.connection = await createConnection({
    type: 'postgres',
    host: this.app.locals.DB_HOST,

至:

this.connection = await createConnection({
    type: 'postgres',
    host: 'host.docker.internal',
    port: this.app.locals.DB_PORT

它完美地工作。我想了解我的配置缺少什么

1 个答案:

答案 0 :(得分:0)

好吧,我知道了,我在docker-compose中缺少网络部分:

services:
    api: 
      ...
      networks: 
       - postgres