Node.js 如何连接节点docker容器和postgres docker容器

Node.js 如何连接节点docker容器和postgres docker容器,node.js,postgresql,docker,docker-compose,Node.js,Postgresql,Docker,Docker Compose,我有一个CRUD应用程序在节点上工作,在我的本地机器上。它运行在node上,以postgres作为数据库,使用knex.js作为查询生成器等 我创建了一个docker文件和一个docker compose文件,容器开始运行,但节点容器无法到达postgres容器。我怀疑这与环境变量有关,但我不确定。这是我的docker文件: FROM node:12 # Create app directory WORKDIR /usr/src/app # Install app dependencies #

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

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

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文件:

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
文件,它根据环境处理db连接:

// Update with your config settings.

module.exports = {

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

此外,当我检查docker中节点应用程序上的hosts文件时,我没有看到任何提到postgres容器链接的内容。感谢您的帮助。

Docker compose将创建一个内部网络,供其启动的不同容器共享。
由于
app
postgres
是两个独立的容器,因此它们被视为两个主机。这会使应用程序在指向
localhost
而不是postgres容器时,在同一容器上查找postgres


您可以通过在
knex.js
文件中使用
postgres
更改
localhost
来解决此问题。

节点应用程序未连接的原因是,当您引用
localhost
时,它正试图连接到自身。您的数据库位于非本地的第二个容器中,因此您需要通过服务名称(即
postgres
)来引用它

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

// Update with your config settings.

module.exports = {

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

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

谢谢,这就是我的想法,但我不确定如何更新连接文件。我将尝试您建议的编辑。假设这是可行的,那么理论上我可以从节点容器运行迁移,它应该像平常一样迁移/种子化数据库?看起来docker文件会将整个源代码复制到映像中,所以只需确保运行
docker compose build
然后
docker compose down;docker compose up-d
,它将更新新文件。您可以通过
docker compose exec app cat/path/to/knex.js
验证它是否有编辑。是的,只要您成功建立了连接,您的迁移就应该可以工作。也就是说,我没有看到您将任何凭据传入连接字符串的任何位置,因此可能需要首先修复。我确实尝试从连接字符串传递凭据,但我认为格式错误,因为我遇到了一些奇怪的错误。我正在寻找文档来告诉我字符串的格式应该是什么样的,如果我不能很快找到它,你能告诉我正确的格式是什么吗?我假设我需要从
docker compose
文件中传递凭据?我最终还是让它工作了,
connection:'postgres://app:password@postgres/db'
现在我需要弄清楚如何在docker composeGood中添加第二个测试数据库。不过,我不认为可以使用开箱即用的入口点创建第二个db。您可能需要手动创建或修改入口点(例如,)。