当前位置: 首页 > 面试题库 >

如何对现有数据使用PostgreSQL容器?

聂炜
2023-03-14
问题内容

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

我的部分来自PostgreSQL的docker-compose.yml文件:

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时,我收到以下消息:

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


问题答案:

为了建立irakli的答案,这里有一个更新的解决方案

  • 使用较新的版本2 Docker Compose文件
  • 单独的volumes部分
  • 多余的设置已删除
version: '2'

services:
  postgres9:
    image: postgres:9.4
    expose:
      - 5432
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data: {}

演示

启动Postgres数据库服务器:

$ docker-compose up

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

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

它不会显示任何内容,因为数据库为空白。创建一个表:

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

列出新创建的表:

$ 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”,否则将出现“输入设备不是TTY”错误。

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

列出表以验证还原是否有效:

$ 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 |                   |

总结起来,我们已经验证了可以启动数据库,重新启动后数据仍然存在,并且可以从主机将备份还原到该数据库中。

谢谢托马斯!



 类似资料:
  • 我正在尝试设置一个PostgreSQL容器(https://hub.docker.com/_/Postgres/)。我有一些来自当前PostgreSQL实例的数据。我从中复制了它,并希望将它设置为PostgreSQL容器的卷。 但我得到了同样的错误,我做错了什么? 我使用pg_dumpall获得了SQL,并将其放入/docker-entrypoint-initdb.d中,但每次执行时都会执行该文件

  • 我正在使用PostgreSQL创建一个简单的Spring Boot应用程序。我使用“docker-comush up”创建了2个图像和容器,我还使用Flyway将我的数据库表迁移到容器中。 问题是如何移动数据,或者如何在Docker容器应用程序上访问本地计算机上的数据库数据? 我在Docker容器上运行我的应用程序,并使用获取HTTP方法,但没有数据。我得到一个空的JSON,而如果我不使用Dock

  • 我想在不使其成为管理员的情况下授予用户数据库的所有权限。我想这样做的原因是目前DEV和PROD是同一集群上的不同DBs,因此我不希望用户能够更改生产对象,但它必须能够更改DEV上的对象。 我尝试了: 但它似乎没有给予任何许可。 然后我尝试: 它似乎允许我创建对象,但不允许我在属于其他用户的模式上查询\delete对象 我可以继续通过给予用户USAGE权限MY_SCHEMA但它会抱怨没有在表上的权限

  • PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和对专有系统比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server的一种选择。 PostgreSQL和MySQL比较,它更加庞大一点,因为它是用来替代Oracle

  • 问题内容: 将XML数据(从网页获得)插入PostgreSQL数据库的最佳方法是什么? 我正在使用Java,需要一些帮助,以找到一种将这些数据读入数据库的好方法。 问题答案: Postgres具有(感谢DanielLyons指出)本机XML支持您可以用来存储表格。但是,如果您想手动切碎XML数据,则有多种可能性可以在数据库中表示XML数据。第一个问题应该是,如果您想要一个非常通用的解决方案,它将能

  • 我有一篇docker文章。yml,我有一个Postgres数据库,Grafana在上面运行以查询数据。 我用命令docker compose up启动这个compose,但是如果我不想丢失任何数据,我必须运行docker compose stop,而不是docker compose down。 我还阅读了,但“提交操作将不包括安装在容器内的卷中包含的任何数据”,所以我想它对我的需求没有用。 存储创