如何使用卷在dockerized postgres数据库中保存数据

时间:2017-01-13 15:02:12

标签: postgresql docker docker-compose docker-volume

我的docker compose文件有三个容器,web,nginx和postgres。 Postgres看起来像这样:

postgres:
  container_name: postgres
  restart: always
  image: postgres:latest
  volumes:
    - ./database:/var/lib/postgresql
  ports:
    - "5432:5432

我的目标是将与postgres容器中名为./database的本地文件夹对应的卷挂载为/var/lib/postgres。当我启动这些容器并将数据插入postgres时,我确认/var/lib/postgres/data/base/已经填充了我添加的数据(在postgres容器中),但在我的本地系统中,./database只会获得其中包含data文件夹,即./database/data已创建,但该文件夹为空。为什么?

注意:

更新1

Per Nick的建议,我做了docker inspect并找到了:

    "Mounts": [
        {
            "Source": "/Users/alex/Documents/MyApp/database",
            "Destination": "/var/lib/postgresql",
            "Mode": "rw",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Name": "e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35",
            "Source": "/var/lib/docker/volumes/e5bf22471215db058127109053e72e0a423d97b05a2afb4824b411322efd2c35/_data",
            "Destination": "/var/lib/postgresql/data",
            "Driver": "local",
            "Mode": "",
            "RW": true,
            "Propagation": ""
        }
    ],

这使得数据似乎被另一个我自己没编码的卷所窃取。不知道为什么会这样。 postgres图像是否为我创建了该卷?如果是这样,有什么方法可以使用该卷而不是我重新启动时安装的卷?否则,是否有一种很好的方法可以禁用其他卷并使用我自己的卷./database

更新2

我找到了解决方案,感谢尼克! (和另一位朋友)以下答案。

4 个答案:

答案 0 :(得分:179)

奇怪的是,解决方案最终要改变

volumes:
  - ./postgres-data:/var/lib/postgresql

volumes:
  - ./postgres-data:/var/lib/postgresql/data

答案 1 :(得分:66)

您可以为所有Postgres数据

创建常见的
 docker volume create pgdata

或者您可以将其设置为撰写文件

   version: "3"
   services:
     db:
       image: postgres
       environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=postgress
         - POSTGRES_DB=postgres
       ports:
         - "5433:5432"
       volumes:
         - pgdata:/var/lib/postgresql/data
       networks:
         - suruse
   volumes: 
     pgdata:

它将创建卷名 pgdata 并将此卷装载到容器的路径。

您可以检查此卷

docker volume inspect pgdata

// output will be
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/pgdata/_data",
        "Name": "pgdata",
        "Options": {},
        "Scope": "local"
    }
]

答案 2 :(得分:6)

我会避免使用相对路径。请记住,docker是一个守护进程/客户端关系。

当你执行compose时,它基本上只是分解成各种docker客户端命令,然后传递给守护进程。然后./database相对于守护程序,而不是客户端。

现在,the docker dev team has some back and forth on this issue,但最重要的是它会产生一些意想不到的结果。

简而言之,不要使用相对路径,使用绝对路径。

答案 3 :(得分:2)

我认为您只需要先使用@output在docker之外创建卷,然后重复使用它。

当我以前经常使用docker时,不可能使用具有dockerfile定义的静态docker卷,所以我的建议是尝试命令行(最终使用脚本)。