首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >码头-撰写: Postgresql ECONNREFUSED

码头-撰写: Postgresql ECONNREFUSED
EN

Stack Overflow用户
提问于 2020-02-22 23:24:11
回答 1查看 349关注 0票数 0

今天,我尝试修改一个完整的应用程序(前端、API和数据库),这样我就可以将它部署到本地机器或/和虚拟机上。

在做时:

代码语言:javascript
复制
docker-compose up

当我尝试用以下env变量启动我的API时,我得到了一个"Connect ECONNREFUSED“,该API将连接到数据库(它在引擎盖下使用Sequelize ):

代码语言:javascript
复制
DATABASE_URL: "postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-jy95}@db:5432/${POSTGRES_DB:-sourcecode}"

码头医生中,有人说:

每个容器现在可以查找主机名、web或db,并返回相应容器的IP地址。例如,web的应用程序代码可以连接到URL postgres://db:5432,并开始使用Postgres数据库。

PostgreSQL文档中,我们可以看到postgresql://也是有效的:

代码语言:javascript
复制
The URI scheme designator can be either postgresql:// or postgres://. Each of the URI parts is optional.

以下是我的完整docker-compose.yml文件:

代码语言:javascript
复制
version: '3.7'
services:
  frontend:
    image: jy95/sourcecode-front
    restart: always
    depends_on:
      - api
    ports:
      - "80:3000"
      - "443:3000"
    environment:
      API_SERVER: "api:8080"
      CDN_SERVER: "api:8080/files"
  api:
    image: jy95/sourcecode_api
    restart: always
    ports:
      - "8080:3000"
    depends_on:
      - db
    environment:
      DATABASE_URL: "postgresql://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-jy95}@db:5432/${POSTGRES_DB:-sourcecode}"
      # use a env file if you want to use other values that default ones
      # https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
  db:
    image: postgres:12-alpine
    restart: always
    ports:
      - "5432:5432"
    environment:
      # use a env file for that part later
      # https://docs.docker.com/compose/environment-variables/#the-env_file-configuration-option
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: jy95
      POSTGRES_DB: sourcecode
      POSTGRES_PORT: 5432
      # If we want to access more easily to the database (not recommended)
      # PGDATA: /var/lib/postgresql/data/pg_data
    #volumes:
    #  - pg_data:/var/lib/postgresql/data/pg_data

提前感谢您的帮助

PS:这些图像已经在码头枢纽上了

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-23 02:10:05

您的评论实际上是一个很大的线索:“这是我使用的命令(正如我所看到的,我使用了"depends_on”来确保数据库在API之前是必需的)。错误是: SequelizeConnectionRefusedError: connect 127.0.0.1:5432 --我不明白这一点:码头文档不是最新的?“

看来您的api容器正在尝试拍摄本地主机,而不是db:5432 (正如您已经指出的,db是一个DNS名称,它不太可能解析为127.0.0.1 (IP保留给本地主机)。

快速调试:运行: docker -it sh (在容器中) apk添加busybox- ->,然后: telnet 127.0.0.1 5432 ->您将看到这是不可访问的,但是telnet db 5432 ->非常好,而且您可以运行nslookup db ->,因为我们已经建立了这个dns名称(db)应该是可解析的。

我曾尝试将network_mode: host添加到api中(在docker-come.yml中),但这会导致应用程序崩溃。此时,我建议检查api的代码,并查找对127.0.0.1:5432的引用,如果您运行了docker -it sh,然后: printenv,您将看到DB_URL环境变量设置为: postgresql://postgres:jy95@db:5432/sourcecode,但是您确定这个ENV是由api使用的吗?(也许您已经按示例注释了一些代码,并且仍然在使用不同的连接字符串)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60357796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档