Node.js Can’;t从应用程序容器连接到postgresDB docker容器
我目前在docker和连接节点项目与Postgres时遇到了一些问题 我已经问了一个相关的问题,但是,我不能把注意力集中在nodeJs和postgres之间的连接问题上 我的docker compose文件如下所示:Node.js Can’;t从应用程序容器连接到postgresDB docker容器,node.js,postgresql,docker,docker-compose,postgis,Node.js,Postgresql,Docker,Docker Compose,Postgis,我目前在docker和连接节点项目与Postgres时遇到了一些问题 我已经问了一个相关的问题,但是,我不能把注意力集中在nodeJs和postgres之间的连接问题上 我的docker compose文件如下所示: # docker-compose.yml version: "2.1" services: app: build: . ports: - "49160:8080" networks: - webnet depends_o
# docker-compose.yml
version: "2.1"
services:
app:
build: .
ports:
- "49160:8080"
networks:
- webnet
depends_on:
db:
condition: service_healthy
environment:
DATABASE_URL: postgres://postgres:taskin@db:5432/mydb
db:
image: kartoza/postgis:9.6-2.4
networks:
- webnet
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=mypassword
- POSTGRES_MULTIPLE_EXTENSIONS=postgis,pgrouting
- ALLOW_IP_RANGE=0.0.0.0/0
volumes:
- pgdata:/var/lib/postgresql/data
restart: on-failure
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
networks:
webnet:
volumes:
pgdata: {}
我的Dockerfile具有以下输入:
#node 8
FROM node:8
#Create app directory
WORKDIR /usr/src/app
#Install app dependencies
COPY package*.json ./
RUN npm install
#Bundle app source
COPY . .
EXPOSE 8080
CMD ["npm", "start"]
my nodeJS express服务器具有以下设置:
var pg = require('pg');
var conString = process.env.DATABASE_URL || "postgres://postgres:mypassword@db:5432/mydb";
var client = new pg.Client(conString);
client.connect()
当我运行docker compose时
pg_hba.conf
和postgresql.conf
来解决这个问题,如本链接中所述sudo docker compose up
。获得以下输出在尝试了很多之后,我可以修复它。我的docker compose文件是正确的,我的
ajax请求
没有正确定义。更换后
$.ajax({
url: 'http://db:8080/show',
type: "POST",
data: CoordjsonObject,
dataType: "json",
success: function(data) {
addStreetsLayer(data);
console.log("worked!")
},
error: function(xhr) {
console.log(xhr)
}
});
到
在尝试了很多之后,我可以修复它。我的docker compose文件是正确的,我的
ajax请求
没有正确定义。更换后
$.ajax({
url: 'http://db:8080/show',
type: "POST",
data: CoordjsonObject,
dataType: "json",
success: function(data) {
addStreetsLayer(data);
console.log("worked!")
},
error: function(xhr) {
console.log(xhr)
}
});
到
app_1_ca885d4626de | wait-for-it.sh:等待15秒等待db:5432
:可能再等一点,因为第一个错误发生在db_1_ceb54072343c | 2019-07-04 12:23:14.921 UTC[18]之前约1秒日志:数据库系统已准备好接受连接
?现在我收到另一个错误消息:错误:connect econnreference172.20.0.2:5432
此外,根据您的情况,您可以使用healthcheck
(从未使用过它),主要取决于。运行时,最好将此等待它。sh
逻辑移到编写器。您等待了多长时间?我想说,要验证错误是否真的来自数据库未准备就绪,您应该等待120秒(当节点启动时,您的日志不应该再显示任何与DB
-相关的内容,这样您就可以确定问题是否源于两个容器之间缺乏同步)。我删除了wait-for-it.sh命令,并在我的docker compose文件中将其替换为dependens_on:db,但仍然得到Error:getaddrinfo ENOTFOUND db:5432
app_1; ca885d4626de | wait-for-it.sh:等待db:5432 15秒:可能再等一点,因为第一个错误发生在db_1; ceb54072343c | 2019-07-04 12:23:14.921 UTC之前大约1秒[18] 日志:数据库系统已准备好接受连接
?现在我收到另一个错误消息:错误:connect econnrefuse172.20.0.2:5432
另外,根据您可以使用健康检查
(从未使用过)主要取决于。当你运行它时,最好将这个等待它。sh
逻辑转移到编写器。你等了多长时间?我想说,要验证错误是否真的来自数据库没有准备好,你应该等120秒(当节点启动时,您的日志不应该再显示任何与db
相关的内容,这样您就可以确定问题是否来自两个容器之间缺乏同步)。我删除了wait-for-it.sh命令,并将其替换为docker compose文件中的dependens_on:db,但仍然得到错误:getaddrinfo ENOTFOUND db:5432
$.ajax({
url: 'http://IP-ADRESS-OF-NODE-CONTAINER:8080/show',
type: "POST",
data: CoordjsonObject,
dataType: "json",
success: function(data) {
addStreetsLayer(data);
console.log("worked!")
},
error: function(xhr) {
console.log(xhr)
}
});