如何使用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
至于:如何导入初始数据,你可以:
- docker cp,进入安装程序的data-only容器,或者
- 使用数据的SQL转储,而不是移动二进制文件(这是我会做的)。