gpt4 book ai didi

node.js - 使用 Knex.js 和 PostgreSQL 设置 Docker

转载 作者:搜寻专家 更新时间:2023-11-01 00:36:49 25 4
gpt4 key购买 nike

今天,我一直在尝试为与 Knex.js、PostgreSQL 和 Node.js 一起运行的 GraphQL API 设置 Docker。我面临的问题是 Knex.js 在尝试访问我的数据库中的数据时超时。我认为这是由于我尝试将它们链接在一起的方式不正确。

我真的试过自己做这件事,但我想不通。我想遍历每个对完成这项工作起到一定作用的文件,以便(希望)有人能发现我的错误并帮助我。

knex文件.js

在我的 knexfile 中,我有一个 connection 键,它曾经看起来像这样:

连接:'postgres://localhost/devblog'

这工作得很好,但如果我想使用 Docker,这将无法工作。所以我稍微修改了一下,结果是这样的:

connection: {
host: 'db' || 'localhost',
port: process.env.DB_PORT || 5432,
user: process.env.DB_USER || 'postgres',
password: process.env.DB_PASSWORD || undefined,
database: process.env.DATABASE // DATABASE = devblog
}

我注意到 host 有问题。因为当我有其他东西(在本例中为 db)而不是 localhost 时它总是超时。

Docker文件

我的 Dockerfile 如下所示:

FROM node:9
WORKDIR /app
COPY package-lock.json /app
COPY package.json /app
RUN npm install
COPY dist /app
COPY wait-for-it.sh /app
CMD node index.js
EXPOSE 3010

docker-compose.yml

这个文件看起来像这样:

version: "3"
services:
redis:
image: redis
networks:
- webnet
db:
image: postgres
networks:
- webnet
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: martinnord
POSTGRES_DB: devblog
web:
image: node:8-alpine
command: "node /app/dist/index.js"
volumes:
- ".:/app"
working_dir: "/app"
depends_on:
- "db"
ports:
- "3010:3010"
environment:
DB_PASSWORD: password
DB_USER: martinnord
DB_NAME: devblog
DB_HOST: db
REDIS_HOST: redis
networks:
webnet:

当我尝试使用 docker-compose up 运行它时,我得到以下输出:

Starting backend_db_1 ... done
Starting backend_web_1 ... done
Attaching to backend_db_1, backend_redis_1, backend_web_1
redis_1 | 1:C 12 Feb 16:05:21.303 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1 | 1:C 12 Feb 16:05:21.303 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=1, just started
db_1 | 2018-02-12 16:05:21.337 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
redis_1 | 1:C 12 Feb 16:05:21.303 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | 1:M 12 Feb 16:05:21.311 * Running mode=standalone, port=6379.
db_1 | 2018-02-12 16:05:21.338 UTC [1] LOG: listening on IPv6 address "::", port 5432
redis_1 | 1:M 12 Feb 16:05:21.311 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 12 Feb 16:05:21.314 # Server initialized
redis_1 | 1:M 12 Feb 16:05:21.315 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
db_1 | 2018-02-12 16:05:21.348 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1 | 2018-02-12 16:05:21.367 UTC [20] LOG: database system was shut down at 2018-02-12 16:01:17 UTC
redis_1 | 1:M 12 Feb 16:05:21.317 * DB loaded from disk: 0.002 seconds
redis_1 | 1:M 12 Feb 16:05:21.317 * Ready to accept connections
db_1 | 2018-02-12 16:05:21.374 UTC [1] LOG: database system is ready to accept connections
web_1 | DB_HOST db
web_1 |
web_1 | App listening on 3010
web_1 | Env: undefined

但是当我尝试使用 GraphQL 进行查询时,我得到:"message": "Knex:获取连接超时。池可能已满。您是否错过了 .transacting(trx) 调用?"

我真的不知道为什么这对我不起作用,这让我抓狂。如果有人可以帮助我,我会很高兴。我还在下面添加了指向我的项目的链接。

非常感谢阅读!干杯。

项目链接:https://github.com/Martinnord/DevBlog/tree/master/backend

更新的 docker-compose 文件:

version: "3"
services:
redis:
image: redis
networks:
- webnet
db:
image: postgres
networks:
- webnet
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: martinnord
POSTGRES_DB: devblog
ports:
- "15432:5432"
web:
image: devblog-server
ports:
- "3010:3010"
networks:
- webnet
environment:
DB_PASSWORD: password
DB_USER: martinnord
DB_NAME: devblog
DB_HOST: db
REDIS_HOST: redis
command: ["./wait-for-it.sh", "db:5432", "--", "node", "index.js"]
networks:
webnet:

最佳答案

可能是这样的:

version: "3"
services:
redis:
image: redis
db:
image: postgres
environment:
POSTGRES_PASSWORD: password
POSTGRES_USER: martinnord
POSTGRES_DB: devblog
ports:
- "15432:5432"
web:
image: node:8-alpine
command: "node /app/dist/index.js"
volumes:
- ".:/app"
working_dir: "/app"
depends_on:
- "db"
ports:
- "3010:3010"
links:
- "db"
- "redis"
environment:
DB_PASSWORD: password
DB_USER: martinnord
DB_NAME: devblog
DB_HOST: db
REDIS_HOST: redis

并且您应该能够通过以下方式从 webapp 连接到 postgres:postgres://martinnord:password@db/devblog

connection: {
host: process.DB_HOST,
port: process.env.DB_PORT || 5432,
user: process.env.DB_USER || 'postgres',
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME || 'postgres'
}

我还添加了将在 docker 中运行的 postgres 暴露给端口 15432 的行,因此您可以尝试先直接从您的主机连接它

psql postgres://martinnord:password@localhost:15432/devblog

关于node.js - 使用 Knex.js 和 PostgreSQL 设置 Docker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com