![](/img/trans.png)
[英]Unable to connect to postgres, redis from nodejs server in docker container: getting connect ECONNREFUSED
[英]Server in docker container unable to connect to postgres database in another docker container
我有一个节点服务器正在尝试使用knex连接到 postgres 数据库。 两者都在具有相同自定义网络的 docker 容器中。 我不断收到 ECONNREFUSED 错误。 我在数据库容器中四处寻找,发现我的数据库( test_db
)是由 psql 创建的,但它没有权限。 授予root
权限后,我仍然遇到同样的问题。 我尝试使用docker-compose down -v
删除卷,但仍然没有运气。 我也试过删除 knex 并只使用node-postgres但同样的错误。 我也无法使用 pgadmin 从主机连接到 Db。 将不胜感激任何帮助!
这是我的 docker-compose.yml
version: "3"
services:
server:
build:
context: .
dockerfile: development.Dockerfile
ports:
- "8081:8081"
volumes:
- .:/src
- /src/node_modules
networks:
- dev-network
environment:
DB_HOSTNAME: pg-development
DB_USER: root
DB_PASSWORD: helloworld
DB_PORT: 3306
DB_NAME: test_dev
depends_on:
- pg-development
pg-development:
image: postgres
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: helloworld
POSTGRES_DB: test_dev
ports:
- "3308:3306"
volumes:
- dbdata:/data/db
networks:
- dev-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U root -d test_dev"]
interval: 10s
timeout: 2s
retries: 10
networks:
dev-network:
driver: bridge
volumes:
dbdata:
这是我的数据库连接
import knex from "knex";
const connection = {
host: process.env.DB_HOSTNAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
port: Number(process.env.DB_PORT),
database: process.env.DB_USER,
};
const db = knex({
client: "pg",
connection,
debug: true,
pool: {
min: 0,
max: 50,
afterCreate: function (conn, done) {
conn.query('SET timezone="UTC";', function (err) {
if (err) {
done(err, conn);
}
});
},
},
});
我是因为您在pg-development
容器中暴露了错误的端口:
https://docs.docker.com/compose/reference/port/
port [options] SERVICE PRIVATE_PORT
您在数据库中公开的端口是3308
端口,正确的配置应该是:
...
ports:
- "3306:3306"
...
这不起作用的原因是因为数据库实际上是在默认的 postgres 端口 5432 上启动的。在 docker-compose.yml 中,您需要添加一个命令来更改默认端口。
pg-development:
image: postgres
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: helloworld
POSTGRES_DB: test_dev
ports:
- "3308:3306"
volumes:
- dbdata:/data/db
networks:
- dev-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U root -d test_dev"]
interval: 10s
timeout: 2s
retries: 10
command: -p 3306 // this fixes the issue
这在 docker-compose 中对我有用,其中一个容器是 postgresqldb,另一个容器是 .net 核心 3.1 容器。
#docker-compose.yml
version: '3.4'
services:
customerdb:
image: postgres
customer.api:
image: ${DOCKER_REGISTRY-}customerapi
build:
context: .
dockerfile: Customer/Customer.API/Dockerfile
docker-compose.override.yml
customerdb:
container_name: customerdb
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
POSTGRES_USER: postgres
ports:
- 5100:5432
volumes:
- ./postgres-data1:/var/lib/postgresql/data
customer.api:
container_name: customerapi
environment:
- ASPNETCORE_ENVIRONMENT=Development
- "ConnectionStrings:CustomerConnection=host=host.docker.internal;port=5100;database=CustomerDB;username=postgres;password=postgres"
depends_on:
- customerdb
volumes:
- ${HOME}/.microsoft/usersecrets/:/root/.microsoft/usersecrets
- ${HOME}/.aspnet/https:/root/.aspnet/https
ports:
- "8000:80"
我使用 ConnectionStrings:CustomerConnection=host=... 因为我曾经使用 app.config 来获取连接字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.