使用docker重新启动postgres时数据丢失

时间:2016-10-01 15:20:33

标签: postgresql docker docker-compose

我正在运行一个postgres实例,其中包含docker-compose.yml -

postgres:
  restart: always
  image: postgres:latest
  volumes:
    - /data:/var/lib/postgresql
  ports:
    - "5432:5432"
  environment:
    - POSTGRES_USER=admin
    - POSTGRES_PASSWORD=123456
    - POSTGRES_DB=mydb
    - PGDATA=/var/lib/postgresql/data

我添加了一些几行的表格。 我在文件中做了一些小改动,添加了container_name: postgres, 并使用docker-compose up -d

重新启动

现在当我登录数据库时,我看不到任何表/数据。

psql -h ###### -p 5432 -d mydb -U admin --password

数据目录作为卷添加并且完好无损。

是否与初始化postgres有关?

更新2016/10/02

请注意,/data是主机docker-machine上安装的外置硬盘。

更新2016/10/02

另外我注意到,当我更改docker-compose.yml的位置(从/home/ubuntu/dev/docker-storage/docker-compose.yml/home/ubuntu/dev/storage/docker-compose.yml)并执行docker-compose up -d时,我收到错误说< / p>

ERROR: for postgres  Conflict. The name "/postgres" is already in use by container 6de8378a8156ec368748194f8912836a7b5e3212fbb69627093d0f6114b82f0d. 
You have to remove (or rename) that container to be able to reuse that name.

问题来自哪里?我可能已经删除了原始容器。

更新2016/10/06

这似乎现在正在发挥作用。出于某种奇怪的原因,我必须同时安装/var/lib/postgresql/var/lib/postgresql/data

postgres:
    restart: always
    image: postgres:latest
    container_name: postgres
    volumes:
      - /data/postgresql:/var/lib/postgresql
      - /data/postgresql/data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=123456
      - POSTGRES_DB=mydb

4 个答案:

答案 0 :(得分:4)

您所做的是骇客! 官方的方法是有一个名为PGDATA的环境变量,与容器的卷路径相同

您要去的地方

postgres:
    restart: always
    image: postgres:latest
    container_name: postgres
    volumes:
      - ${PATH_TO_STORAGE}:/var/lib/postgresql/data/:rw <--- check this out
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      PGDATA: /var/lib/postgresql/data/ <--- Check this out

希望这会有所帮助:)

答案 1 :(得分:1)

up -d未重启。我想你刚开始一个新的实例。您可以使用restart

docker-compose restart ...

答案 2 :(得分:1)

我注意到你的主机卷目录名是数据,但是你把它挂载到postgresql而不是postgresql / data。

我不确定这是否会导致这个问题,但清理似乎是一件好事。

答案 3 :(得分:0)

有关现有/ postgres容器的错误意味着在尝试启动具有相同名称的新容器之前,您没有成功关闭所有内容。

可能发生的事情是你启动了两个指向同一数据目录的postgres实例。这可能会导致数据损坏。

指定容器名称是防止这种情况发生的好方法,因为如您所见,Docker不会让您启动具有相同名称的第二个实例。