首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连接node docker容器和postgres docker容器

如何连接node docker容器和postgres docker容器
EN

Stack Overflow用户
提问于 2019-11-13 03:33:20
回答 2查看 3.5K关注 0票数 1

我有一个CRUD应用程序在我的本地机器上的node上工作。它在节点上运行,使用postgres作为数据库,使用knex.js作为查询构建器,等等。

我已经创建了一个docker文件和一个docker-compose文件,容器启动了,但是节点容器无法到达postgres容器。我怀疑这与环境变量有关,但我不确定。这是我的docker文件:

代码语言:javascript
复制
FROM node:12
# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./

RUN npm ci --only=production

# Bundle app source
COPY . .

ENV PORT=8080
EXPOSE 8080

CMD [ "npm", "start" ]

这是docker-compose文件:

代码语言:javascript
复制
version: '2'
services:
  postgres:
    image: postgres:alpine
    environment:
      POSTGRES_PASSWORD: password
      POSTGRES_USER: app
      POSTGRES_DB: db

  app:
    build: .
    depends_on:
      - "postgres"
    links:
      - "postgres"
    environment:
      DB_PASSWORD: 'password'
      DB_USER: 'app'
      DB_NAME: 'db'
      DB_HOST: 'postgres'
      PORT: 8080
    ports:
      - '8080:8080'
    command: npm start

此外,下面是根目录上的knex.js文件,它根据环境处理数据库连接:

代码语言:javascript
复制
// Update with your config settings.

module.exports = {

  development: {
    client: 'pg',
    connection: 'postgres://localhost/db'
  },
  test: {
    client: 'pg',
    connection: 'postgres://localhost/test-db'
  }
};

此外,当我在docker内的node app上检查hosts文件时,我没有看到任何提到postgres容器的链接。任何帮助都会很感谢,谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-11-13 03:47:22

您的节点应用程序没有连接的原因是,当您引用localhost时,它会尝试连接到它自己。您的数据库在第二个容器中,该容器不是本地的,因此您需要通过服务名来引用它,服务名应该是postgres

因此,假设您的应用程序正在以另一种方式处理身份验证,您的配置将如下所示:

代码语言:javascript
复制
// Update with your config settings.

module.exports = {

  development: {
    client: 'pg',
    connection: 'postgres://postgres/db'
  },
  test: {
    client: 'pg',
    connection: 'postgres://postgres/test-db'
  }
};

如果可以,您应该使用分配给app容器的环境变量。

票数 2
EN

Stack Overflow用户

发布于 2019-11-13 03:47:05

Docker-compose创建了一个由它启动的不同容器共享的内部网络。

由于apppostgres是两个独立的容器,因此它们被视为两个主机。当你将postgres指向localhost而不是postgres容器时,这会导致app在同一个容器上查找postgres。

只需在knex.js文件中使用postgres更改localhost即可解决此问题。

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

https://stackoverflow.com/questions/58825501

复制
相关文章

相似问题

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