Sta*_*z42 31 postgresql node.js sequelize.js docker
我正在构建一个使用postgresql在NodeJS上运行的应用程序.我正在使用SequelizeJS作为ORM.为了避免使用真正的postgres守护进程并在我自己的设备上安装nodejs,我正在使用带有docker-compose的容器.
当我运行docker-compose up
它时启动pg数据库
database system is ready to accept connections
Run Code Online (Sandbox Code Playgroud)
和nodejs服务器.但是服务器无法连接到数据库.
Error: connect ECONNREFUSED 127.0.01:5432
Run Code Online (Sandbox Code Playgroud)
如果我尝试在不使用容器的情况下运行服务器(在我的机器上使用真正的nodejs和postgresd)它可以工作.
但我希望它与容器一起正常工作.我不明白我做错了什么.
这是docker-compose.yml文件
web:
image: node
command: npm start
ports:
- "8000:4242"
links:
- db
working_dir: /src
environment:
SEQ_DB: mydatabase
SEQ_USER: username
SEQ_PW: pgpassword
PORT: 4242
DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase
volumes:
- ./:/src
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pgpassword
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?
(喜欢泊船的人:))
And*_*ndy 51
你DATABASE_URL指的是127.0.0.1,这是环回适配器(更多这里).这意味着"连接到我自己".
在同一主机上运行这两个应用程序(不使用Docker)时,它们都可以在同一个适配器上寻址(也称为localhost).
在容器中运行这两个应用程序时,它们不像以前一样在localhost上.相反,您需要将web容器指向适配器db上的容器的IP地址docker0- 它docker-compose为您设置.
更改:
DATABASE_URL: postgres://username:pgpassword@127.0.0.1:5432/mydatabase
Run Code Online (Sandbox Code Playgroud)
至
DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase
Run Code Online (Sandbox Code Playgroud)
这要归功于Docker链接:web容器有一个文件(/etc/hosts),其中的db条目指向db容器所在的IP .这是尝试解析主机名时系统(在本例中为容器)的第一个位置.
Abu*_*mon 25
欲了解更多的读者,如果您使用的Docker desktop for Mac使用host.docker.internal,而不是localhost或127.0.0.1作为它的建议的文档。我遇到了同样的connection refused...问题。后端api-service无法连接到postgres使用localhost/127.0.0.1. 下面是我的 docker-compose.yml 和环境变量作为参考:
version: "2"
services:
api:
container_name: "be"
image: <image_name>:latest
ports:
- "8000:8000"
environment:
DB_HOST: host.docker.internal
DB_USER: <your_user>
DB_PASS: <your_pass>
networks:
- mynw
db:
container_name: "psql"
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_DB: <your_postgres_db_name>
POSTGRES_USER: <your_postgres_user>
POSTGRES_PASS: <your_postgres_pass>
volumes:
- ~/dbdata:/var/lib/postgresql/data
networks:
- mynw
Run Code Online (Sandbox Code Playgroud)
小智 7
我有两个容器,一个称为 postgresdb,另一个称为调用节点
我将节点 requests.js 更改为:
const pool = new Pool({
user: 'postgres',
host: 'localhost',
database: 'users',
password: 'password',
port: 5432,
})
Run Code Online (Sandbox Code Playgroud)
到
const pool = new Pool({
user: 'postgres',
host: 'postgresdb',
database: 'users',
password: 'password',
port: 5432,
})
Run Code Online (Sandbox Code Playgroud)
我所要做的就是将主机更改为我的容器名称 [“postgresdb”],这为我解决了这个问题。我确信这可以做得更好,但我在过去 2 天刚刚学习了 docker compose / node.js 的东西。
如果您单独发送数据库变量。您可以分配数据库主机。
DB_HOST=<POSTGRES_SERVICE_NAME> #in your case "db" from docker-compose file.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34169 次 |
| 最近记录: |