Quero executar meu Node.js, Postgres e Ngnix no mesmo contêiner docker, mas estou recebendo o erro abaixo
2025-04-02 20:07:11 Erro de conexão Erro: conectar ECONNREFUSED 127.0.0.1:5432 2025-04-02 20:07:11 em TCPConnectWrap.afterConnect [como oncomplete] (node:net:1555:16)
Por que o aplicativo node.js não consegue se conectar ao banco de dados?
docker-compose.yml
services:
nginx:
image: nginx:latest
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
depends_on:
- node-api
node-api:
build: .
environment:
- DB_HOST=postgres
- DB_PORT=5432
- DB_NAME=database
- DB_USER=postgres
- DB_PASSWORD=password
ports:
- "3000:3000"
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgis/postgis:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: database
ports:
- "5432:5432"
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres", "-h", "localhost"]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s
volumes:
postgres-data:
Arquivo Docker
# Use an official Node.js runtime as a parent image
FROM node:18
# Set the working directory
WORKDIR /app
# Copy package.json and install dependencies
COPY package.json package-lock.json ./
RUN npm install
# Copy the rest of the application
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Start the application
CMD ["node", "api/apis.js"]
EDITADO: --------------
api.js
import express from 'express'
import cors from 'cors'
import client from './postgres_connection.js'
const app = express();
app.use(cors());
app.use(express.json());
app.get('/getMarkers', async (req, res) => {
try {
const result = await client.query('SELECT * FROM public.topo_markers');
res.json(result.rows);
}
catch (errr) {
console.error(errr.message);
res.status(500).send('Internal server error');
}
});
app.post('/addMarker', async (req, res) => {
const { title, description, latitude, longitude } = req.body;
const isBodyEmpty = !title || !description || !latitude || !longitude;
if (isBodyEmpty) {
return res.status(400).send('Missing required properties');
}
try {
const query = `
INSERT INTO public.topo_markers (title, description, geom)
VALUES ($1, $2, ST_SetSRID(ST_MakePoint($3, $4), 4326)) RETURNING *;
`;
const result = await client.query(query, [title, description, longitude, latitude]);
res.status(201).json(result.rows[0]);
} catch (errr) {
console.error(errr.message);
res.status(500).send('Internal server error');
}
});
app.listen(3000)
postgres_connection.js
import pg from 'pg';
const client = new pg.Client({
user: 'postgres', // Default is usually 'postgres'
host: 'localhost', // Use the container's IP if needed
database: 'test_database', // Change to your database name
password: 'password', // Set this properly
port: 5432, // Default PostgreSQL port
});
client.connect()
.then(() => console.log('Connected to PostGIS!'))
.catch(err => console.error('Connection error', err.stack));
export default client;
De acordo com a mensagem de erro, você está tentando se conectar ao Postgres em 127.0.0.1:5432. Então você está usando
localhost
ou127.0.0.1
como o nome do host do postgres no seu aplicativo Node.Em um contêiner, localhost é o próprio contêiner. Você precisa usar o
postgres
nome do serviço compose como o nome do host.Parece que você está tentando fazer isso passando
postgres
comoDB_HOST
variável de ambiente para o aplicativo Node, mas, por algum motivo, ele não a está usando.Tente olhar seu código Node para ver por que ele não está pegando a variável DB_HOST. Se precisar de ajuda, edite sua postagem e adicione o código node relevante a ela. Se você editar sua postagem, poderá remover o arquivo de configuração Nginx. Isso não é relevante para seu problema.
EDITAR APÓS O CÓDIGO DO NÓ ADICIONADO À POSTAGEM:
No seu postgres_connection.js, você está usando valores codificados em vez de usar variáveis de ambiente.
Tente alterar a configuração do cliente para
Então, ele usará os valores das variáveis de ambiente. Suas variáveis de ambiente parecem corretas, então deve funcionar.