Почему сценарии в docker-entrypoint-initdb.d выполняются до того, как база данных начинает прослушивать соединения, вызывающие сбой pg_restore? - PullRequest
0 голосов
/ 23 октября 2019

Согласно разделу «Сценарии инициализации» https://hub.docker.com/_/postgres, У меня есть два файла в docker-entrypoint-initdb.d:

  1. init-db.sh
  2. backup.dump

init-db.sh содержит:

#!/bin/sh
pg_restore -h localhost -p 5432 -U postgres -d postgres -v "/docker-entrypoint-initdb.d/backup.dump"
exit

и, похоже, выполняется, но получает сообщение об ошибке подключения к серверу, так как кажется, что сервер еще не начал слушатьна порту 5432, но, как видно из приведенных ниже файлов журналов,

Что я делаю не так? По сути, я хочу восстановить базу данных после инициализации и запуска контейнера-докера postgres.

После запуска контейнера, если я вручную запускаю сценарий init-db.sh в сеансе терминала, он создает базу данных. именно так, как я хочу ...

2019-10-23T17:09:43.032659100Z /usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/backup.dump
2019-10-23T17:09:43.032699100Z
2019-10-23T17:09:43.032704200Z /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init-db.sh
2019-10-23T17:09:43.069092100Z pg_restore: connecting to database for restore
2019-10-23T17:09:43.069518400Z pg_restore: error: connection to database "postgres" failed: could not connect to server: Connection refused
2019-10-23T17:09:43.069534000Z  Is the server running on host "localhost" (127.0.0.1) and accepting
2019-10-23T17:09:43.069538000Z  TCP/IP connections on port 5432?
2019-10-23T17:09:43.069540800Z could not connect to server: Cannot assign requested address
2019-10-23T17:09:43.069543700Z  Is the server running on host "localhost" (::1) and accepting
2019-10-23T17:09:43.069546600Z  TCP/IP connections on port 5432?
2019-10-23T17:09:45.514371200Z 2019-10-23 17:09:45.514 UTC [1] LOG:  starting PostgreSQL 12.0 (Debian 12.0-2.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2019-10-23T17:09:45.514563000Z 2019-10-23 17:09:45.514 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
2019-10-23T17:09:45.514629800Z 2019-10-23 17:09:45.514 UTC [1] LOG:  listening on IPv6 address "::", port 5432
2019-10-23T17:09:45.522068300Z 2019-10-23 17:09:45.521 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2019-10-23T17:09:45.547131800Z 2019-10-23 17:09:45.547 UTC [23] LOG:  database system was interrupted; last known up at 2019-10-23 17:09:42 UTC
2019-10-23T17:09:45.977904500Z 2019-10-23 17:09:45.977 UTC [23] LOG:  database system was not properly shut down; automatic recovery in progress
2019-10-23T17:09:45.980523000Z 2019-10-23 17:09:45.980 UTC [23] LOG:  invalid record length at 0/16453B0: wanted 24, got 0
2019-10-23T17:09:45.980590000Z 2019-10-23 17:09:45.980 UTC [23] LOG:  redo is not required
2019-10-23T17:09:45.994889300Z 2019-10-23 17:09:45.994 UTC [1] LOG:  database system is ready to accept connections

docker-compose.yml:

version: '3.4'

networks:
  dev01:
    driver: bridge

services:
  webapplication2:
    image: ${DOCKER_REGISTRY-}webapplication2
    depends_on:
      - "pgdev01"
    build:
      context: .
      dockerfile: WebApplication2/Dockerfile
    networks:
     - dev01
  pgdev01:
    image: postgres 
    restart: always 
    volumes:
      - db_volume:/var/lib/postgresql/data
      - ./dbscripts/:/docker-entrypoint-initdb.d/
    networks:
      - dev01
volumes:
  db_volume:

docker-compose.override.yml:

version: '3.4'

services:
  webapplication2:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44361
    ports:
      - "61225:80"
      - "44361:443"
    volumes:
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
  pgdev01:
    ports:
      - "5434:5432" 
    environment:
      POSTGRES_PASSWORD: "redacted"

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Изменение

pg_restore -h localhost -p 5432 -U postgres -d postgres -v "/docker-entrypoint-initdb.d/backup.dump"

на

pg_restore -U postgres -d postgres -v "/docker-entrypoint-initdb.d/backup.dump"

исправило это. Я понятия не имею, почему ... Это было дикое предположение, основанное на журналах, показывающих невозможность подключения к postgres с хостом и портом ...

0 голосов
/ 23 октября 2019

Вы столкнулись с этой проблемой, потому что вы включили -h localhost в ваш файл init-db.sh. Если вы удалите его, все будет работать.

Это происходит потому, что в файле docker-entrypoint.sh по умолчанию, предоставленном изображением postgres, опустошится listen_addresses на этапе инициализации . Поэтому он не будет слушать localhost.

Раскрытие информации: я работаю для предприимчивых (EDB)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...