【问题标题】:Docker NodeJS app cant connect to postgres databaseDocker NodeJS 应用程序无法连接到 postgres 数据库
【发布时间】:2022-01-11 20:40:45
【问题描述】:

我对 docker 和 docker-compose 还很陌生。我尝试使用包含 nodejs (Nest.js) api、postgres db 和 pgadmin 的 docker 启动一些服务。如果没有对 API(nodejs)应用程序进行 docker 化,我可以连接到 docker 数据库容器,但是现在我也已经对节点应用程序进行了 docker 化,它不再连接,我不知道为什么。我的设置方式有什么问题吗?

这是我的 docker-compose 文件

version: "3"
services:
  nftapi:
    env_file:
      - .env
    build:
      context: .
    ports:
      - '5000:5000'
    depends_on: 
      - postgres
    volumes: 
      - .:/app
      - /app/node_modules
    networks:
      - postgres
      
  postgres:
    container_name: postgres
    image: postgres:latest
    ports:
    - "5432:5432"
    volumes:
    - /data/postgres:/data/postgres
    env_file:
    - docker.env
    networks:
    - postgres
 
  pgadmin:
    links:
    - postgres:postgres
    container_name: pgadmin
    image: dpage/pgadmin4
    ports:
    - "8080:80"
    volumes:
    - /data/pgadmin:/root/.pgadmin
    env_file:
    - docker.env
    networks:
    - postgres
 
networks:
  postgres:
    driver: bridge

这是成功构建的 nodejs 应用程序 Dockerfile,在日志中我看到该应用程序正在尝试连接到数据库,但它无法(没有特定错误)只是找不到数据库。

# Image source
FROM node:14-alpine

# Docker working directory
WORKDIR /app

# Copying file into APP directory of docker
COPY ./package.json /app/

RUN apk update && \
    apk add git
# Then install the NPM module
RUN yarn install

# Copy current directory to APP folder
COPY . /app/

EXPOSE 5000
CMD ["npm", "run", "start:dev"]

我的项目根目录中有 2 个 env 文件。

  1. .env
  2. docker.env

如上所述,当我从 docker 中删除“nftapi”服务并使用简单的 npm start 运行 nodejs 时,它正在连接到 postgres 容器。

TypeOrmModule.forRoot({
      type: 'postgres',
      host: process.env.POSTGRES_HOST,
      port: Number(process.env.POSTGRES_PORT),
      username: process.env.POSTGRES_USER,
      password: process.env.POSTGRES_PASSWORD,
      database: process.env.POSTGRES_DB,
      synchronize:true,
      entities: ['dist/**/*.entity{.ts,.js}'],
    }),

在 typeorm 模块中使用的 .env 文件中的主机是 localhost

【问题讨论】:

  • 你给什么地址连接postgres?
  • 我编辑了最初的帖子,包括它现在尝试连接的方式
  • 好的,但是 POSTGRES_HOST 的值是多少?
  • 它只是 .env 文件中的“localhost”,所以没有引号
  • 必须是'postgres'

标签: node.js postgresql docker nestjs


【解决方案1】:

通过 docker-compose 使用网络时,您应该使用服务名称作为主机名。

所以在您的情况下,主机名应该是 postgres 而不是 localhost

您可以在此处阅读更多信息: https://docs.docker.com/compose/networking/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2019-05-24
    • 2019-07-30
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2014-04-04
    相关资源
    最近更新 更多