docker-compose up && docker-compose build:PostgreSQL的错误



我尝试实现我的docker-compose文件,但是我的数据库PostgreSQL有一个错误。如果我从NPM启动开始我的项目,我没有问题。对于使用Docker开始我的项目,我使用:Docker-Compose& amp;Docker-Compose Build

docker-compose.yml
version: "3"
services:
  server:
    build: .
    container_name: dev-area-2018
    ports:
      - 8080:8080
    depends_on:
      - db
db:
  image: postgres:latest
  ports:
    - 5432:5432
  environment:
    DATABASE_URL: postgres://postgers@db:5432/API
# volumes:
#   - /var/lib/postgres/data
client:
   build: ./client_web/
   container_name: client_web
   ports:
     - 8081:8081

我的输出:

Starting client_web         ... done
Starting dev_area_2018_db_1 ... done
Starting dev-area-2018      ... done
Attaching to dev_area_2018_db_1, client_web, dev-area-2018
db_1      | 2019-02-28 17:51:40.679 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db_1      | 2019-02-28 17:51:40.679 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db_1      | 2019-02-28 17:51:40.698 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db_1      | 2019-02-28 17:51:40.741 UTC [23] LOG:  database system was shut down at 2019-02-28 17:46:23 UTC
db_1      | 2019-02-28 17:51:40.759 UTC [1] LOG:  database system is ready to accept connections
client_web |
client_web | > dev-area-2018-client@0.0.0 start /usr/src/app
client_web | > node ./app.js
client_web |
client_web | Your client is currently running on port 8081
dev-area-2018 |
dev-area-2018 | > dev-area-2018@0.0.0 start /usr/src/app
dev-area-2018 | > node ./bin/www
dev-area-2018 |
dev-area-2018 | Server running at http://localhost:8080/
dev-area-2018 | could not connect to postgres { Error: connect ECONNREFUSED 127.0.0.1:5432
dev-area-2018 |     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1083:14)
dev-area-2018 |   errno: 'ECONNREFUSED',
dev-area-2018 |   code: 'ECONNREFUSED',
dev-area-2018 |   syscall: 'connect',
dev-area-2018 |   address: '127.0.0.1',
dev-area-2018 |   port: 5432 }

我不明白为什么我无法将服务器连接到数据库PostgreSQL与Docker。

编辑:感谢您的帮助,但是有了您的解决方案,我始终存在相同的问题和相同的输出。我成功地完成了这个Docker-Compose:

version: "3"
services:
  server:
    build: .
    container_name: dev-area-2018
    restart: always
    ports:
      - 8080:8080
    links:
      - db
      - db:database
    depends_on:
      - db
    environment:
      DATABASE_URL: postgres://postgres@db
  client:
    build: ./client_web/
    container_name: client_web
    ports:
       - 8081:8081
  db:
    image: postgres:latest
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: postgres
      POSTGRES_DB: API

谢谢,问候。

在将Postgres与Docker一起使用时,我建议不要像上面一样设置URL。您在上面设置的URL已经是您通过内部Docker网络访问它的方式。如果您删除了它,则URL需要访问Postgres实例为postgres://USER:PWD@postgres/your_db

另外,您的URL确实有一个错字。

我不明白为什么我无法将服务器连接到数据库 带Docker的PostgreSQL。

因为在大多数情况下,server容器将启动并尝试连接到db容器,但是,db需要时间启动(通常为10-15秒)。

这就是为什么您会得到could not connect to postgres { Error: connect ECONNREFUSED 127.0.0.1:5432异常,因为db没有启动并准备好接受连接。

您可以做的是在无法启动后重新启动server容器。

version: "3"
services:
  server:
    build: .
    container_name: dev-area-2018
    restart: always # will restart the container if fails to start
    ports:
      - 8080:8080
    depends_on:
      - db
...

您的项目客户端正在尝试在127.0.0.1:5432中访问邮政局,该地址不再适用于Docker Architecture。

根据Docker文档:

默认情况下,为您的应用程序设置了一个网络。每个 服务的容器连接默认网络,并且都是 该网络上的其他容器可到达,可通过 它们在与容器名称相同的主机名上。

docker为您管理虚拟网络中的所有实例,并通过使用您分配给Docker-Compose文件中的容器的名称来提供它们。

因此,从您的客户端,您必须使用下面的字符串访问邮局:

 postgres://<user>:<password>@db/api.

请注意,Docker会捕获对db的任何请求,并将其重定向到由Docker管理的虚拟网络中的host:port

最新更新