【问题标题】:Docker (compose) : making knex work with postgresDocker(撰写):使 knex 与 postgres 一起工作
【发布时间】:2018-11-03 10:18:26
【问题描述】:

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

错误:连接 ECONNREFUSED 172.18.0.2:15432
在 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

'app' 服务的 Dockerfile

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 新手?

最好的问候,

【问题讨论】:

    标签: postgresql docker docker-compose knex.js


    【解决方案1】:

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

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

    ports:
      - "15432:5432"
    

    仅确保您可以从您的 主机 机器上的端口 15432 调用该服务。但是如果你想从app内部调用服务db,你仍然需要使用db:5432

    【讨论】:

    • 嗯,你说得对,看来我对docker还有很多要学的!
    【解决方案2】:

    @the-bass 的回答救了我。我将包含我的 docker-compose.yml 和 knexfile.js 文件,希望能让有这个问题的人更清楚地看到这篇文章。

    我做错的是我没有在我的应用容器中正确设置主机环境变量。一旦我将其更改为仅使用 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:
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2020-05-05
      • 2014-11-24
      • 2020-10-06
      • 1970-01-01
      • 2018-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多