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

我在docker compose的角色.关于PostgreSQL的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次.

推荐答案

根据伊拉克利的回答,这里有一个更新的解决方案:

  • 使用更新的版本2 Docker Compose文件
  • 分开volumes
  • 额外设置已删除

docker-compose.yml

version: '2'

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

volumes:
  data: {}

demo

启动Postgres数据库服务器:

$ docker-compose up

显示数据库中的所有表.在另一个 docker ,与集装箱的postman 交谈:

$ 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数据库,并判断了它是否保证了我们的数据安全可靠.

storing data

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

$ 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容器中.

Note:使用"exec-i",not"-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相关问答推荐

如何将存储的、生成的列添加到非常大的表中?

如何在PostgreSQL中对深度嵌套的jsonb属性创建索引

在PostGreSQL中获取最近日期的项目

在 Postgresql 中实现自定义运算符时出错

空表上的 Postgres 意外行为

从dump文件中恢复三张表遇到的问题

Windows上的psql:错误:编码UTF8的字节序列无效:0xc8 0x20

用于生产的 Rails 性能调优?

PostgreSQL 输入结束时的语法错误

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

在执行 postgresql 函数时提交事务

MAC OS X 上的 Postgres 权限被拒绝

PostgreSQL如何连接间隔值'2天'

在这个 Dockerfile 中创建的 Postgres 用户名/密码在哪里?

Sidekiq - 无法在 5.000 秒内获得数据库连接

如何将表的一列复制到PostgreSQL中比较相同ID的另一表的列

使用 Postgresql 数据库(OSX Lion)创建 Rails 3.1 应用程序

用于将布尔列排序为 true、null、false 的 SQL

如何在不丢失openproject数据的情况下将postgresql数据库从10升级到12

提高查询速度:simple SELECT in big postgres table