我的docker合成文件有三个容器,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/ postgress。当我启动这些容器并将数据插入postgres时,我验证/var/lib/postgres/data/base/充满了我添加的数据(在postgres容器中),但在我的本地系统中,./database只在其中获得一个数据文件夹,即./database/data被创建,但它是空的。为什么?

注:

这表明我的上述文件应该工作。 这个人正在使用docker服务,这很有趣

更新1

根据尼克的建议,我做了一个码头工人检查,发现:

    "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?


当前回答

您可以为所有Postgres数据创建一个公共卷

docker volume create pgdata

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

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"
    }
]

其他回答

我认为你只需要先在docker外部用docker create -v /location——name创建卷,然后重用它。

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

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

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

现在,docker开发团队在这个问题上有一些反复,但底线是它可能会产生一些意想不到的结果。

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

您可以为所有Postgres数据创建一个公共卷

docker volume create pgdata

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

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"
    }
]

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

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

to

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