如何在Docker环境中启动时,如何从节点服务器连接到postgres

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Docker环境中启动时,如何从节点服务器连接到postgres相关的知识,希望对你有一定的参考价值。

我目前在docker中遇到一些问题,并在其中运行时将节点项目与postgres连接。我使用docker toolbox,因为我没有windows pro。

我的docker-compose文件看起来像这样

version: '3'
 services:
  db:
    image: postgres:latest
    ports:
     - "5432:5432"
  environment:
    POSTGRES_PASSWORD: 123456
    POSTGRES_USER: postgres
    POSTGRES_DB: dockerdb
  network_mode: bridge
  container_name: postgres
  volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

 web:
  build: .
  ports:
   - "5000:5000"
   - "3000:3000"
  depends_on:
   - db
  environment:
   DB_HOST: db

我的快递服务器就是这个,这个时候有点乱。

const { Pool } = require('pg')
var express = require('express');
var app = express;

const pool = new Pool({
  user: 'postgres',
  host: process.env.DB_HOST || 'localhost',
  database: 'dockerdb',
  password: '123456',
  port: 5432
  
})

// the pool with emit an error on behalf of any idle clients
// it contains if a backend error or network partition happens
pool.on('error', (err, client) => {
  console.error('Unexpected error on idle client', err)
  process.exit(-1)
})

// callback - checkout a client
pool.connect((err, client, done) => {
  if (err) throw err
  client.query('SELECT * FROM users WHERE id = $1', [1], (err, res) => {
    done()

    if (err) {
      console.log(err.stack)
    } else {
      console.log(res.rows[0])
    }
  })
})

当我在docker中运行它时,容器运行,我可以通过终端访问postgress db并与之交互,比如创建和插入这样的东西,但我的节点程序似乎没有连接它,因为我没有得到任何控制台日志,我不知道是因为连接问题还是因为一些noobie错误,有些人可以帮助我。顺便说一下,我在init.sql文件中创建了一个名为users的表,并为其提供了数据,我可以使用psql命令从docker终端访问数据。

这是一张在docker里面发生了什么的图片。 enter image description here

答案

发生这种情况是因为db需要一些时间来启动并且您的docker会同时组合您的服务器和db启动。因此,您需要在服务器上有一些延迟才能启动数据库。我在github中有一个例子,你可以下载并测试https://github.com/PedroS11/node-postgres-redis-docker。检查我的docker-compose文件,你可以看到我有一个脚本等待它。此脚本具有睡眠状态,因此服务器仅在数据库之后15秒启动。

另一答案

要清理你的Express API,我会像这样重构:

// Express App Setup
const express = require(‘.express’);
const bodyParser = require(‘body-parser’);
const cors = require(‘cors’);

const app = express();
app.use(cors());
app.use(bodyParser.json());

// Postgres Client Setup
const { Pool } = require(‘pg’);
const pgClient = new Pool({
   user: keys.pgUser,
   host: keys.pgHost,
   database: keys.pgDatabase,
   password: keys.pgPassword,
   port: keys.pgPort
});
pgClient.on(‘error’, () => console.log(‘Lost PG Connection’));

pgClient.query(‘CREATE TABLE IF NOT EXISTS values (number INT)’)

这假设你还没有创建一个成功的连接,这意味着你还没有创建一个表,你需要做一些连接。

所以这里的表的名称将是值并存储一列信息,这些信息将被称为数字,这是我从连接到Express API的前端应用程序提交的值的索引,所以你将必须将该表查询调整为项目的规范,但您将使用CREATE TABLE IF NOT EXISTS

然后我添加一个catch语句,这样如果创建该表出现任何问题,那么你将控制日志错误,如下所示:

// Express App Setup
const express = require(‘.express’);
const bodyParser = require(‘body-parser’);
const cors = require(‘cors’);

const app = express();
app.use(cors());
app.use(bodyParser.json());

// Postgres Client Setup
const { Pool } = require(‘pg’);
const pgClient = new Pool({
   user: keys.pgUser,
   host: keys.pgHost,
   database: keys.pgDatabase,
   password: keys.pgPassword,
   port: keys.pgPort
});
pgClient.on(‘error’, () => console.log(‘Lost PG Connection’));

pgClient.query(‘CREATE TABLE IF NOT EXISTS values (number INT)’).catch(err => console.log(err));

对于你的docker-compose.yml,我只想重构它:

version: "3"
services:
  postgres:
    image: "postgres:latest"

并运行docker-compose up,看看它是怎么回事。

以上是关于如何在Docker环境中启动时,如何从节点服务器连接到postgres的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Docker 容器连接到 Nvidia MPS 服务器?

如何在启动时启动 Docker 守护进程(Windows 服务)而无需登录?

从外部连接到 docker 容器中的 Postgresql

如何使用 Docker Desktop for Windows 从主机连接到 Cassandra

在 AWS ELB 上运行 Docker 容器,连接到主机节点应用程序

如何从 Docker 容器中的 python 脚本连接到 Ubuntu 上的本地 SQL 服务器