Docker Postgres存储持久性并在本地

时间:2018-12-06 02:19:03

标签: database postgresql docker docker-compose

所以!最近开始过渡到Docker,我遇到了麻烦。我有一个本地Postgres数据库,正在尝试进入容器,然后在容器运行后继续存在。但是,当我docker-compose updocker-compose up --build时,我在Docker中的postgres容器没有正确(或根本没有)创建数据库。我主要遇到FATAL: database "yourappdb" does not exist错误。

应用程序的背景: 就本文而言,它是带有Postgres的Flask / Python API。它使用SQLAlchemy来处理连接。

Docker设置 我使用从本地数据库生成的SQL文件尝试填充Docker Postgres容器中的数据库。据我了解,我使用initdb入口点来简化此操作。

我看到的错误 不幸的是,正如我在简介中提到的,我已经看到了几个不同的错误。我想知道在构建没有看到更改的容器时是否正在进行某种缓存?

  • FATAL: database "yourappdb" does not exist-这是主要错误。看来根本没有创建数据库。
  • 第二个错误很奇怪。在对yourappdb.sql文件进行更改后运行docker-compose up --build时...我看到它已经运行了好几次!它说用户/所有者“ myname”还不存在。我无法重现此内容。

我尝试过的事情

  • 我尝试在.sql文件内部的表之前为数据库创建用户名/密码(如下所示)。
  • 我尝试使用postgres docker中心文档中提到的init-user脚本在数据库之前创建用户(您可以在docker-compose文件中看到对该用户的注释)。
  • 我尝试在docker容器中的sql文件和/ data库之间创建一个卷吗?

最后的笔记 因此,经过所有这些尝试并多次删除了图像/容器并一遍又一遍地重建...我先连接到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;

顺便说一句,这个应用程序可以在本地正常运行并连接到数据库,等等。

0 个答案:

没有答案