如果我将此绑定安装用于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)
答案 0 :(得分:0)
可能是权限问题。在Docker主机上运行。
chown -R 70:70 ./pg-data
如果在Windows主机上,请检查该文件夹是否对所有用户(所有人)具有写权限。
答案 1 :(得分:0)
我将详细检查您的问题,使用docker for windows
,volumes: - ./mysql-data:/var/lib/mysql
将Windows文件夹./mysql-data
挂载到拥有所有权/var/lib/mysql
的容器文件夹root:root
中。然后,mysql:8.0
的入口点将启动mysql服务器并将其放入/var/lib/mysql
中,以便您可以在Windows的文件夹中看到它们。
但是,如果您查看日志,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文件夹中。
最后,如果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
我将此问题留待跟踪。
我们能做什么?
当前,一种解决方法是使用命名卷:
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计算机,您无法访问它,但是它将始终保留在那里。这意味着即使您下次删除容器,使用相同的命名卷,您的容器仍然可以使用持久数据。
我们能期待什么?
也许您可以期望WSL2
,它是Microsoft在Windows中嵌入了Linux内核,
然后我们可以在其中安装docker,也许可以解决此问题。