如何使用Postgresql容器与现有的数据?

我正在尝试设置postgresql容器( https://hub.docker.com/_/postgres/ )。 我有一些来自当前postgres实例的数据。 我从/ var / lib / postgresql / data中复制了它,并且想将它设置为一个到postgres容器的卷。

docker-compose.yml关于postgres的一部分:

db: image: postgres:9.4 ports: - 5432:5432 environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres PGDATA : /var/lib/postgresql/data volumes: - /Users/ihorsamusenko/projects/own/docker_php/pgdata:/var/lib/postgresql/data 

当我使docker组成时,我得到这个消息:

 db_1 | initdb: directory "/var/lib/postgresql/data" exists but is not empty db_1 | If you want to create a new database system, either remove or empty db_1 | the directory "/var/lib/postgresql/data" or run initdb db_1 | with an argument other than "/var/lib/postgresql/data". 

我试图从容器中创build自己的图像,所以我的Dockerfile是:

 FROM postgres:9.4 COPY pgdata /var/lib/postgresql/data 

但是我得到了同样的错误,我做错了什么?

更新

我得到了SQL使用pg_dumpall并把它放在/docker-entrypoint-initdb.d,但是这个文件每次执行docker组成。

在docker工作我真的很新,任何提示对我来说真的很有帮助。

伊拉克利的答案,这是一个更新的解决scheme:

  • 使用更新的版本2 Docker Compose文件
  • 单独的volumes部分
  • 额外设置被删除

泊坞窗,compose.yml

 version: '2' services: postgres9: image: postgres:9.4 expose: - 5432 volumes: - data:/var/lib/postgresql/data volumes: data: {} 

演示

启动Postgres数据库服务器:

 $ docker-compose up 

显示数据库中的所有表。 在另一个terminal,与容器的Postgres交谈:

 $ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z' 

它什么都不显示,因为数据库是空白的。 创build一个表格:

 $ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'create table beer()' 

列出新创build的表格:

 $ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z' Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+-----------+-------+-------------------+-------------------------- public | beer | table | | 

好极了! 我们现在使用共享存储卷启动了一个Postgres数据库,并在其中存储了一些数据。 下一步是在服务器停止之后检查数据是否真实存在。

现在,杀死Postgres服务器容器:

 $ docker-compose stop 

再次启动Postgres容器:

 $ docker-compose up 

我们期望数据库服务器将重新使用存储,所以我们非常重要的数据仍然存在。 检查:

 $ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z' Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+-----------+-------+-------------------+-------------------------- public | beer | table | | 

我们已经成功地使用了一种新型的Docker Compose文件来运行一个使用外部数据卷的Postgres数据库,并且检查它是否保证我们的数据安全无虞。

存储数据

首先进行备份,将数据存储在主机上:

 $ docker exec -it $(docker-compose ps -q postgres9 ) pg_dump -Upostgres > backup.sql 

从客人数据库中删除我们的数据:

 $ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c 'drop table beer' 

将我们的备份(存储在主机上)还原到Postgres容器中。

注意:使用“exec -i”, 而不是 “-it”,否则你会得到一个“input设备不是TTY”的错误。

 $ docker exec -i $(docker-compose ps -q postgres9 ) psql -Upostgres < backup.sql 

列出表格以validation还原是否奏效:

 $ docker exec -it $(docker-compose ps -q postgres9 ) psql -Upostgres -c '\z' Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+-----------+-------+-------------------+-------------------------- public | beer | table | | 

总而言之,我们已经validation了我们可以启动一个数据库,数据在重新启动后依然存在,我们可以从主机恢复备份。

感谢Tomasz!

看起来像Postgres图像有挂载的问题。 FWIW,它可能比Dockers更多的Postgres问题,但这并不重要,因为挂载磁盘不是持久数据库文件的推荐方式。

您应该创build仅用于数据的泊坞窗容器。 喜欢这个:

 postgres9: image: postgres:9.4 ports: - 5432:5432 volumes_from: - pg_data environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres PGDATA : /var/lib/postgresql/data/pgdata pg_data: image: alpine:latest volumes: - /var/lib/postgresql/data/pgdata command: "true" 

我testing和工作正常。 您可以在这里阅读更多关于纯数据容器的信息: https : //medium.com/@ramangupta/why-docker-data-containers-are-good-589b3c6c749e

至于:如何导入初始数据,你可以:

  1. docker cp,进入安装程序的data-only容器,或者
  2. 使用数据的SQL转储,而不是移动二进制文件(这是我会做的)。