所以!最近开始过渡到Docker,我遇到了麻烦。我有一个本地Postgres数据库,正在尝试进入容器,然后在容器运行后继续存在。但是,当我docker-compose up
或docker-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
-这是主要错误。看来根本没有创建数据库。docker-compose up --build
时...我看到它已经运行了好几次!它说用户/所有者“ myname”还不存在。我无法重现此内容。我尝试过的事情
最后的笔记
因此,经过所有这些尝试并多次删除了图像/容器并一遍又一遍地重建...我先连接到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;
顺便说一句,这个应用程序可以在本地正常运行并连接到数据库,等等。