Postgres数据库转储不想在Docker容器中导入

时间:2018-08-15 14:19:11

标签: postgresql import

我的问题:

在导入数据库时​​,(现在)似乎数据库已删除,然后无法连接。 (这以前一直奏效。导入脚本似乎没有更改)。

整个事情都发生在docker容器中。我的第一个猜测不是问题。

创建用于导入的SQL:

pg_dump --host=$HOSTNAME --create --clean --format=plain --username=$USERNAME --file=$DIR_BACKUPS/$DATABASE-latest.sql $DATABASE

$ VARIABLES 是从外部填充的。)

会发生什么:

我将传递给docker的导出的SQL导入:

cat mydbname-latest.sql | docker exec -i test-postgres-9.6 psql -U postgres

脚本运行时,似乎数据库已删除,但以后无法连接。我猜数据库创建失败。 它确实存在,并且在运行哑巴之前就可以连接。

SET
SET
SET
SET
SET
 set_config
------------

(1 row)

SET
SET
SET
DROP DATABASE
ERROR:  invalid locale name: "de_DE.UTF-8"
ERROR:  database "mydbname" does not exist
\connect: FATAL:  database "mydbname" does not exist

为什么在数据库创建失败时脚本失败,这是不可见的?
为什么 ALTER DATABASE 语句会一直运行(如果未创建数据库)?

这是从导出创建的SQL的开始。

--
-- PostgreSQL database dump
--

-- Dumped from database version 9.6.10
-- Dumped by pg_dump version 9.6.10

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

DROP DATABASE mydbname;
--
-- Name: mydbname; Type: DATABASE; Schema: -; Owner: postgres
--

CREATE DATABASE mydbname WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'de_DE.UTF-8' LC_CTYPE = 'de_DE.UTF-8';

ALTER DATABASE mydbname OWNER TO postgres;

\connect mydbname

...

\ connect mydbname 行可能引发错误。

如果有人需要更多信息,请告诉我。感谢您的帮助。

用于从映像创建docker容器的脚本:

docker run -d --name $DOCKER_CONTAINER_NAME -e POSTGRES_DB=$POSTGRES_DATABASE_NAME -e POSTGRES_USER=$POSTGRES_USER -e POSTGRES_PASSWORD=$POSTGRES_PASSWORD -p $POSTGRES_PORT:5432 -v $POSTGRES_DATA:/var/lib/postgresql/data $DOCKER_IMAGE

设置了以下变量:

DOCKER_CONTAINER_NAME=test-postgres-9.6
DOCKER_IMAGE=test/postgres:9.6
POSTGRES_DATABASE_NAME=mydbname
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_PORT=5402
POSTGRES_DATA=/Users/Itsme/docker/test/psql-data

1 个答案:

答案 0 :(得分:1)

Docker确实解决了这个问题!我这边猜错了。
日志文件实际上确实通过日志输出显示了它:
ERROR: invalid locale name: "de_DE.UTF-8"

在Docker中启动的操作系统未设置为处理我想要的语言。

我在德语中设置了SQL哑语。我需要将其存储到使用相同语言设置配置(某种程度上)的OS和数据库中。

我正在使用Mike Dillon的Dockerfile https://github.com/appropriate/docker-postgis/blob/master/9.6-2.4/Dockerfile(2018年6月22日7b8355b)(顺便感谢他:-)。

我确实调整了Dockerfile以使其正常工作:

# Taken from: https://github.com/appropriate/docker-postgis/blob/master/9.6-2.4/Dockerfile (commit 22-JUN-2018 7b8355b985846c1591f596eae0cae78689a36a25)
# Adjusted locales

FROM postgres:9.6
MAINTAINER Mike Dillon <mike@appropriate.io>

ENV POSTGIS_MAJOR 2.4
ENV POSTGIS_VERSION 2.4.4+dfsg-4.pgdg90+1

# manually inserted (idea taken from http://jaredmarkell.com/docker-and-locales/)

RUN apt-get update \
      && apt-get install -y locales locales-all \
      && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR \
      && apt-get install -y --no-install-recommends \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION \
           postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION \
           postgis=$POSTGIS_VERSION \
      && rm -rf /var/lib/apt/lists/*

ENV LC_ALL de_DE.UTF-8
ENV LANG de_DE.UTF-8
ENV LANGUAGE de_DE.UTF-8

RUN mkdir -p /docker-entrypoint-initdb.d
COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/postgis.sh
COPY ./update-postgis.sh /usr/local/bin

我确实通过安装 locales 调整了第一个 RUN 命令,然后将环境切换为所需的语言。

顺便说一句,最后一条命令失败,因为它找不到 update-postgis.sh 文件。

帮助我的是http://jaredmarkell.com/docker-and-locales/对这个问题有了一个想法,然后终于有了https://stackoverflow.com/a/41797247/845117的注释,它为我解决了。