如何在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 Desktop for Windows 从主机连接到 Cassandra