Postgresql Postgres不接受Docker中的连接

Postgresql Postgres不接受Docker中的连接,postgresql,docker,docker-compose,dockerfile,Postgresql,Docker,Docker Compose,Dockerfile,我正在docker toolbox windows 7 sp1上运行docker项目,该项目没有给出任何错误,但仍然是因为postgres没有在不正常的情况下运行整个项目。 Docker compose文件的代码为: version: '3' services: postgres: image: 'postgres:latest' restart: always ports: - "5432:5432" environment: PO

我正在docker toolbox windows 7 sp1上运行docker项目,该项目没有给出任何错误,但仍然是因为postgres没有在不正常的情况下运行整个项目。 Docker compose文件的代码为:

version: '3'
services:
  postgres:
    image: 'postgres:latest'
    restart: always
    ports:
      - "5432:5432" 
    environment:
      POSTGRES_DB: "db"
      POSTGRES_PASSWORD: postgres_password
      POSTGRES_HOST_AUTH_METHOD: "trust"
      DATABASE_URL: postgresql://postgres:p3wrd@postgres:5432/postgres
    deploy:  
      restart_policy:  
        condition: on-failure  
        window: 15m  
  redis:
    image: 'redis:latest'
  nginx:
    restart: always
    build:
      dockerfile: Dockerfile.dev
      context: ./nginx
    ports:
      - '3050:80'  
  api:
    depends_on:
      - "postgres"
    build:
      dockerfile: Dockerfile.dev
      context: ./server
    volumes:
      - ./server/copy:/usr/src/app/data
    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
      - PGUSER=postgres
      - PGHOST=postgres
      - PGDATABASE=postgres
      - PGPASSWORD=postgres_password
      - PGPORT=5432
  client:
    depends_on:
      - "postgres"
    build:
      dockerfile: Dockerfile.dev
      context: ./client
    volumes:
      - ./client/copy:/usr/src/app/data
      - /usr/src/app/node_modules
  worker:
    build:
      dockerfile: Dockerfile.dev
      context: ./worker
    volumes:
      - ./worker/copy:/usr/src/app/data
      - /usr/src/app/node_modules 
    depends_on:
      - "postgres"
但当我运行该项目时,我得到以下信息:

redis_1     | 1:C 29 May 2020 05:07:37.909 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1     | 1:C 29 May 2020 05:07:37.910 # Redis version=6.0.3, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1     | 1:C 29 May 2020 05:07:37.911 # 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 29 May 2020 05:07:37.922 * Running mode=standalone, port=6379.
redis_1     | 1:M 29 May 2020 05:07:37.928 # 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 29 May 2020 05:07:37.929 # Server initialized
redis_1     | 1:M 29 May 2020 05:07:37.929 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1     | 1:M 29 May 2020 05:07:37.933 * Loading RDB produced by version 6.0.3
redis_1     | 1:M 29 May 2020 05:07:37.934 * RDB age 8 seconds
redis_1     | 1:M 29 May 2020 05:07:37.934 * RDB memory usage when created 0.81 Mb
redis_1     | 1:M 29 May 2020 05:07:37.934 * DB loaded from disk: 0.001 seconds
postgres_1  |
postgres_1  | PostgreSQL Database directory appears to contain a database; Skipping initialization
postgres_1  |
postgres_1  | 2020-05-29 05:07:38.927 UTC [1] LOG:  starting PostgreSQL 12.3 (Debian 12.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
postgres_1  | 2020-05-29 05:07:38.928 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1  | 2020-05-29 05:07:38.929 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1  | 2020-05-29 05:07:38.933 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2020-05-29 05:07:38.993 UTC [24] LOG:  database system was shut down at 2020-05-29 05:07:29 UTC
api_1       |
api_1       | > @ dev /usr/src/app
api_1       | > nodemon
api_1       |
api_1       | [nodemon] 1.18.3
api_1       | [nodemon] to restart at any time, enter `rs`
api_1       | [nodemon] watching: *.*

无论是否有数据卷,都会出现相同的错误,因此项目无法运行。请帮助

我假设一旦API启动,它就会尝试连接到Postgres。如果是,这是许多Docker开发人员遇到的典型错误,Postgres DB尚未准备好接受连接,应用程序正在尝试连接到它

您可以通过尝试以下任一方法来解决此问题:

  • 让API层等待一定的时间(足以让Postgres DB启动)
  • 实现一种重试机制,它将在每次连接失败时等待10秒

  • 如果这不起作用,我建议您检查容器外部是否安装了Postgres DB,该容器拥有您试图访问的端口。

    除了Allan Chua的回答,请在docker compose文件中提及对Postgres服务的启动依赖性

        depends_on:
          - postgres
    

    将此添加到您的
    api
    服务中。

    您好,我是docker的新手,请告诉我如何使api层等待,我应该将此线程放置在何处。请执行此操作。api确实尝试连接到postgress@DeepeshAcharya在节点应用程序连接到数据库的位置,延迟执行失败重试循环。我已经编辑了问题中的docker compose文件,但它仍然不起作用。这也是一个重要的问题。值得注意的是,这不会等待数据库完全初始化,而只是指定一个启动顺序。一个完整的解决方案将同时使用依赖和重试。
        depends_on:
          - postgres