Так!Недавно начал переходить на Докер, и я попал в ловушку.У меня есть локальная база данных 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;
Кстати, это приложение работаетнормально локально и подключается к БД и т. д.