gpt4 book ai didi

postgresql - 在 Windows 上绑定(bind)挂载 postgresql 数据不起作用

转载 作者:行者123 更新时间:2023-11-29 13:09:20 24 4
gpt4 key购买 nike

如果我为 MySQL 使用此绑定(bind)挂载,它将在容器启动后填充文件夹/mysql-data

mysql:
image: mysql:8.0
volumes:
- ./mysql-data:/var/lib/mysql

但是如果我对 PostgreSQL 使用相同的方法,文件夹/pg-data 仍然是空的

postgres:
image: postgres:11.3-alpine
volumes:
- ./pg-data:/var/lib/postgresql[/data]

我已经尝试了右侧的两条路径:/var/lib/postgresql/var/lib/postgresql/data

我知道我可以使用数据卷来保存 postgresql 数据。但令我惊讶的是,为什么同样的方法适用于 MySQL 而不适用于 PostgreSQL 容器。

设置:Windows 10,Docker Desktop v2.0.0.3 (31259)

最佳答案

  1. 我详细检查了您的问题,使用 docker for windowsvolumes: - ./mysql-data:/var/lib/mysql 将挂载 windows 文件夹./mysql-data 到容器的文件夹 /var/lib/mysql,所有权为 root:root。然后,mysql:8.0 的入口点将启动 mysql 服务器并将内容放在 /var/lib/mysql 中,这样您就可以在 windows 的文件夹中看到内容。

  2. 但是 postgres:11.3-alpine 的情况有所不同,如果您查看日志:

    PS E:\test> docker-compose logs postgres
    Attaching to test_postgres_1
    postgres_1 | The files belonging to this database system will be owned by user "postgres".
    postgres_1 | This user must also own the server process.
    postgres_1 |
    postgres_1 | The database cluster will be initialized with locale "en_US.utf8".
    postgres_1 | The default database encoding has accordingly been set to "UTF8".
    postgres_1 | The default text search configuration will be set to "english".
    postgres_1 |
    postgres_1 | Data page checksums are disabled.
    postgres_1 |
    postgres_1 | fixing permissions on existing directory /var/lib/postgresql/data ... ok
    postgres_1 | creating subdirectories ... ok
    postgres_1 | selecting default max_connections ... 20
    postgres_1 | selecting default shared_buffers ... 400kB
    postgres_1 | selecting dynamic shared memory implementation ... posix
    postgres_1 | creating configuration files ... ok
    postgres_1 | 2019-07-09 13:50:21.843 UTC [47] FATAL: data directory "/var/lib/postgresql/data" has wrong ownership
    postgres_1 | 2019-07-09 13:50:21.843 UTC [47] HINT: The server must be started by the user that owns the data directory.
    postgres_1 | child process exited with exit code 1
    postgres_1 | initdb: removing contents of data directory "/var/lib/postgresql/data"
    postgres_1 | running bootstrap script ...

    您可以看到数据目录“/var/lib/postgresql/data”拥有错误的所有权,尽管docker-entrypoint.sh已执行 chown -R postgres "$PGDATA" 将所有权从 root 更改为 postgres,但不幸的是,如果您运行Linux 上的容器。对于 Windows,这将失败,但是 postgres 需要此文件夹的所有权是 postgres,而不是 root。所以在windows上连服务都没有启动,那么,你肯定看不到东西弹出到你的windows文件夹。

  3. 最后,如果 docker 主机是 windows,为什么 chown -R postgres "$PGDATA" 失败? This就是答案。

    Unfortunately, with the current implementation (based on CIFS/Samba) we can't improve this.

    Attempting to change these values via chmod/chown will return success but have no effect.

    https://www.samba.org/samba/docs/man/manpages-3/mount.cifs.8.html#id2532725

    I'm leaving this issue open for tracking.

  4. 我们能做什么?

    目前,解决此问题的方法是使用命名卷:

    docker-compose.yaml:

    postgres:
    image: postgres:11.3-alpine
    volumes:
    - pg-data:/var/lib/postgresql/data

    如上,数据不会被pop到windows文件夹pg-data,它只是由docker自己维护。您可以使用 next 检查音量:

    PS E:\test> docker volume inspect pg-data
    [
    {
    "CreatedAt": "2019-07-09T14:09:38Z",
    "Driver": "local",
    "Labels": null,
    "Mountpoint": "/var/lib/docker/volumes/pg-data/_data",
    "Name": "pg-data",
    "Options": null,
    "Scope": "local"
    }
    ]

    虽然 Mountpoint 位于您无法访问的 MOBY VM(您无法访问 Hyper-V 机器),但它会一直保留在那里。这意味着即使您删除容器,下次使用相同的命名卷,您的容器仍然可以使用持久数据。

  5. 我们能期待什么?

    也许你可以期待 WSL2,微软将 linux 内核嵌入到 windows 中,然后我们可以在其中安装docker,也许可以解决这个问题。

关于postgresql - 在 Windows 上绑定(bind)挂载 postgresql 数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56946619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com