我正在尝试设置一个 PostgreSQL 容器( https://hub.docker.com/_/postgres/ )。我有一些来自当前 PostgreSQL 实例的数据。我从 /var/lib/postgresql/data
复制了它,并希望将其设置为 PostgreSQL 容器的卷。
我在 docker-compose.yml 文件中关于 PostgreSQL 的部分:
db:
image: postgres:9.4
ports:
- 5432:5432
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_USER: postgres
PGDATA : /var/lib/postgresql/data
volumes:
- /projects/own/docker_php/pgdata:/var/lib/postgresql/data
当我制作 docker-compose up 时,我收到以下消息:
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".
我试图从容器中创建自己的图像,所以我的 Dockerfile 是:
FROM postgres:9.4
COPY pgdata /var/lib/postgresql/data
但是我得到了同样的错误,我做错了什么?
更新
我使用 pg_dumpall 获取 SQL 并将其放在 /docker-entrypoint-initdb.d 中,但是每次执行 docker-compose up
时都会执行此文件。
原文由 Albert Tobac 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了建立伊拉克利的答案,这是一个更新的解决方案:
volumes
部分码头工人-compose.yml
演示
启动 Postgres 数据库服务器:
显示数据库中的所有表。在另一个终端中,与容器的 Postgres 对话:
它什么都不会显示,因为数据库是空白的。创建表:
列出新创建的表:
耶!我们现在使用共享存储卷启动了一个 Postgres 数据库,并在其中存储了一些数据。下一步是检查服务器停止后数据是否真正保留。
现在,杀死 Postgres 服务器容器:
再次启动 Postgres 容器:
我们期望数据库服务器会重新使用存储,所以我们非常重要的数据仍然存在。查看:
我们已经成功地使用了一种新型 Docker Compose 文件来运行一个使用外部数据卷的 Postgres 数据库,并检查它是否能够保证我们的数据安全无虞。
存储数据
首先,进行备份,将我们的数据存储在主机上:
从来宾数据库中删除我们的数据:
将我们的备份(存储在主机上)恢复到 Postgres 容器中。
注意: 使用“exec -i”, _而不是_“-it”,否则会出现“输入设备不是 TTY”错误。
列出表以验证还原是否有效:
综上所述,我们已经验证了我们可以启动一个数据库,重启后数据仍然存在,我们可以从主机恢复备份。
谢谢托马斯!