Постоянство хранения Docker Postgres и инициализация базы данных на локальном - PullRequest
0 голосов
/ 06 декабря 2018

Так!Недавно начал переходить на Докер, и я попал в ловушку.У меня есть локальная база данных Postgres, которую я пытаюсь получить в контейнер и затем сохранить после запуска контейнера.Однако мой контейнер postgres в Docker не создает мою базу данных должным образом (или вообще), когда я docker-compose up или docker-compose up --build.В основном я получаю ошибку FATAL: database "yourappdb" does not exist.

Справочная информация о приложении: Ради этого поста это API-интерфейс Flask / Python с Postgres.Он использует SQLAlchemy для обработки соединения.

Настройка Docker Я использую файл SQL, сгенерированный из моей локальной базы данных, чтобы попытаться заполнить БД внутри контейнера Docker Postgres.Насколько я понимаю, я использую точку входа initdb, чтобы облегчить это.

Ошибки, которые я вижу К сожалению, я видел несколько разных ошибок, как я упоминал во вступлении,Мне интересно, происходит ли какое-то кэширование при создании контейнера, который не видит изменений?

  • FATAL: database "yourappdb" does not exist - Это основная ошибка.Похоже, база данных вообще не создается.
  • Вторая ошибка странная.Во время работы docker-compose up --build после внесения изменений в файл yourappdb.sql ... Я видел, как он запускался несколько попыток назад!Он сказал, что пользователь / владелец "мое имя" еще не существует.Я не смог воспроизвести это.

То, что я пробовал

  • Я пытался создать пользователя / пароль для БД дотаблицы внутри .sql-файла (как показано ниже).
  • Я пытался использовать скрипт init-user, упомянутый в док-центре postgres docker, чтобы создать пользователя перед базой данных (вы можете увидеть упоминание о нем).закомментировано в файле docker-compose).
  • Я пытался создать том между файлом sql и библиотекой / data в контейнере docker?

Заключительные замечания Итак, после всех этих попыток и многократного удаления образа / контейнера и многократной перестройки ... Я подключился к postgres bash, а затем к psql -U postgres.Я нашел там базу данных с именем myname вместо yourappdb, и внутри она была ТОЛЬКО первой таблицей из 15 или около того таблиц, которые я хотел создать.Какого черта?Так что, похоже, что в какой-то момент он попытался создать базу данных, но не использовал правильное имя базы данных и отказался от части пути.

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

Postgres / Dockerfile

# base image
FROM postgres:10.4-alpine

# run the db file on init
ADD yourappdb.sql /docker-entrypoint-initdb.d

Docker-Compose.yml

version: '3.6'
services:
  postgres:
    build:
      context: ./postgres
      dockerfile: Dockerfile
    ports:
      - 5435:5432
    volumes:
      - './postgres/pgdata:/var/lib/postgresql/data'
      # - './postgres/yourappdb.sql:/docker-entrypoint-initdb.d/yourappdb.sql'
      # - './postgres/init-user-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh'
    environment:
      - POSTGRES_USER=myname
      - POSTGRESS_PASSWORD=test
      - POSTGRES_DATABASE=yourappdb
  api:
    build:
      dockerfile: Dockerfile.dev
      context: ./server
    volumes:
      - './server:/usr/src/app'
    ports:
      - 5001:5000
    environment:
      - FLASK_APP=server/index.py
      - FLASK_ENV=development
      - APP_SETTINGS=config.DevelopmentConfig
      - DATABASE_URL=postgres://myname:test@postgres:5432/yourappdb
      - DATABASE_TEST_URL=postgres://postgres:postgres@postgres:5432/yourappdb
    depends_on:
      - postgres

Часть файла SQL.

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.6.5
-- Dumped by pg_dump version 9.6.5

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


SET search_path = public, pg_catalog;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: administrator; Type: TABLE; Schema: public; Owner: myname
--

CREATE TABLE administrator (
    id integer NOT NULL,
    "timestamp" timestamp without time zone,
    email character varying(255)
);


ALTER TABLE administrator OWNER TO myname;

Я также пытался включить это в файл .sql

CREATE USER myname WITH PASSWORD 'test';
CREATE DATABASE yourappdb;
GRANT ALL PRIVILEGES ON DATABASE yourappdb TO myname;
/c yourappdb;

Кстати, это приложение работаетнормально локально и подключается к БД и т. д.

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