Docker (compose) : 让 knex 与 postgres 一起工作

Docker (compose) : making knex work with postgres

我正在尝试 docker 化 NodeJS / PostgreSQL 应用程序,但我无法 运行 knex 迁移,我收到以下错误:

Error: connect ECONNREFUSED 172.18.0.2:15432
     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1161:14)

这是我的 docker-compose.yml :

version: "3"
services:
  app:
    build: .
    depends_on:
      - db
    links:
      - db
    ports:
      - "3000:3000"
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: users-microservice
      DB_HOST: db
  db:
    image: postgres:10.4-alpine
    expose:
      - "5432"
    ports:
      - "15432:5432"
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
      POSTGRES_DB: users-microservice

Docker文件 'app' 服务:

FROM node:10.1-alpine
EXPOSE 3000 9229 15432
COPY . /home/app
WORKDIR /home/app
RUN npm install
RUN npm install -g knex
CMD ./scripts/start.sh

并且在 start.sh 中,以下命令有效:

until PGPASSWORD=$POSTGRES_PASSWORD psql -h "$DB_HOST" -U "$POSTGRES_USER" -c '\d'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

>&2 echo "Postgres is up - executing command"

所以我可以通过 CLI 连接到 postgres,但 knex 不能,这是为什么?我是不是弄错了什么,我是 Docker 的新手?

此致,

当您看到此错误消息(但也许您可以指定)时,我假设您正在尝试 运行 服务内的命令 app

那么我的猜测是您正试图从 app 内连接到 db:15432。请注意,这句话

ports:
  - "15432:5432"

仅确保您可以从端口 15432 上的 host 计算机调用该服务。但是如果你想从 app 中调用服务 db,你仍然必须使用 db:5432.

@the-bass 的回答救了我。我将包括我的 docker-compose.yml 和 knexfile.js 文件,希望让遇到这个问题的人更清楚地找到这个 post。

我做错的是我没有在我的应用程序容器中正确设置主机环境变量。一旦我将其更改为仅使用 db(我的 postgres 容器的名称)并确保将端口包含在我的 knexfile 中,一切正常。

knexfile.js

require("dotenv").config();

module.exports = {
  development: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      port: 5432,
    },
    pool: {
      min: 2,
      max: 10,
    },
    migrations: {
      directory: "./data/migrations",
    },
  },

  production: {
    client: "pg",
    connection: {
      host: process.env.DB_HOST,
      user: process.env.DB_USER,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      port: 5432,
    },
    pool: {
      min: 2,
      max: 10,
    },
    migrations: {
      directory: "./data/migrations",
    },
  },
};

docker-compose.yml

version: "3.7"

services:
  db:
    image: postgres:12.2
    restart: always
    ports:
      - 5432:5432
    volumes:
      - my-postgres-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=me
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=my-data

  node-app:
    image: node:12.16.2
    command: sh -c "npm install && npm install -g knex && knex migrate:latest && npm start"
    ports:
      - 3001:3001
    working_dir: /home/node/app
    volumes:
      - ./:/home/node/app
    environment:
      - NODE_ENV=development
      - DB_HOST=db
      - DB_USER=HG
      - DB_PASSWORD=password
      - DB_DATABASE=my-data
    depends_on:
      - db
    links:
      - db

volumes:
  my-postgres-data: