在Windows上绑定mount postgresql数据不起作用

时间:2019-07-09 06:39:38

标签: postgresql docker

如果我将此绑定安装用于MySQL,它将在容器启动后填充文件夹/ 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)

2 个答案:

答案 0 :(得分:0)

可能是权限问题。在Docker主机上运行。

chown -R 70:70 ./pg-data

如果在Windows主机上,请检查该文件夹是否对所有用户(所有人)具有写权限。

答案 1 :(得分:0)

  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 ...
    

    您可以看到data directory "/var/lib/postgresql/data" has wrong ownership,尽管docker-entrypoint.sh做了chown -R postgres "$PGDATA"将所有权从root更改为postgres,但是不幸的是,如果您在Linux上运行容器。对于Windows,这将失败,但是postgres要求此文件夹的所有权为postgres,而不是root。因此,该服务甚至没有在Windows上启动,因此,您当然看不到东西弹出到Windows文件夹中。

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

      

    不幸的是,对于当前的实现(基于CIFS / Samba),我们无法改进。

         

    尝试通过chmod / chown更改这些值将返回成功,但无效。

         

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

         

    我将此问题留待跟踪。

  4. 我们能做什么?

    当前,一种解决方法是使用命名卷:

    docker-compose.yaml:

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

    使用上面的命令,数据不会弹出到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,它是Microsoft在Windows中嵌入了Linux内核, 然后我们可以在其中安装docker,也许可以解决此问题。