Docker 容器在 windows 10 中执行时关闭并给出 'data directory has wrong ownership' 错误
Docker container shuts down giving 'data directory has wrong ownership' error when executed in windows 10
我的 docker 安装在 Windows 中。我正在尝试安装 this 应用程序。它给了我以下 docker-compose.yml 文件:
version: '2'
services:
web:
build:
context: .
dockerfile: Dockerfile-nginx
ports:
- "8085:80"
networks:
- attendizenet
volumes:
- .:/usr/share/nginx/html/attendize
depends_on:
- php
php:
build:
context: .
dockerfile: Dockerfile-php
depends_on:
- db
- maildev
- redis
volumes:
- .:/usr/share/nginx/html/attendize
networks:
- attendizenet
php-worker:
build:
context: .
dockerfile: Dockerfile-php
depends_on:
- db
- maildev
- redis
volumes:
- .:/usr/share/nginx/html/attendize
command: php artisan queue:work --daemon
networks:
- attendizenet
db:
image: postgres
environment:
- POSTGRES_USER=attendize
- POSTGRES_PASSWORD=attendize
- POSTGRES_DB=attendize
ports:
- "5433:5432"
volumes:
- ./docker/pgdata:/var/lib/postgresql/data
networks:
- attendizenet
maildev:
image: djfarrelly/maildev
ports:
- "1080:80"
networks:
- attendizenet
redis:
image: redis
networks:
- attendizenet
networks:
attendizenet:
driver: bridge
安装一切顺利,但 PostgreSQL 容器在启动后停止,并出现以下错误。
2018-03-07 08:24:47.927 UTC [1] FATAL: data directory "/var/lib/postgresql/data" has wrong ownership
2018-03-07 08:24:47.927 UTC [1] HINT: The server must be started by the user that owns the data directory
来自 Docker Hub 的一个简单的 PostgreSQL 容器运行顺利,但是当我们尝试将卷附加到容器时发生错误。
我是docker的新手,所以请忽略错误的术语用法。
容器内 postgres 中数据文件夹的所有者是 Postgres 用户。您当前的用户可能没有安装文件夹的访问权限。您需要根据以下给定命令的要求授予所有权限:
chmod 777 ./docker/pgdata
如果此命令无法帮助解决此问题,请参考以下内容link 进行从容器内部到容器外部的用户映射。
https://docs.docker.com/engine/security/userns-remap/#prerequisites
这是 Windows [1][2][3][4] 上 Postgres Docker 图像的记录问题。目前,似乎没有办法将 Windows 目录正确挂载为卷。您可以改用持久的 Docker 卷,例如:
db:
image: postgres
environment:
- POSTGRES_USER=attendize
- POSTGRES_PASSWORD=attendize
- POSTGRES_DB=attendize
ports:
- "5433:5432"
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- attendizenet
volumes:
pgdata:
其他无效的东西:
- 将 PGDATA 设置为子目录(参见 PGDATA Setting)
environment:
- PGDATA=/var/lib/postgresql/data/mnt
volumes:
- ./pgdata:/var/lib/postgresql/data
- 使用绑定安装 (docker-compose 3.2)
volumes:
- type: bind
source: ./pgdata
target: /var/lib/postgresql/data
- 运行 作为 POSTGRES_USER=root
更多信息:
GitHub
Docker 论坛
即使我遇到了问题,我也不得不定期复制数据目录。
docker cp <container-name>:/var/lib/postgresql/data C:/docker/volumes/postgres
请参考 reinierkors 在 here 中的回答。为了 reader 的方便和对我有用
,答案如下从 link 复制而来
我通过将我的本地卷一个目录映射到 Postgres 需要的目录下解决了这个问题:
version: '3'
services:
postgres:
image: postgres
restart: on-failure
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_DB=postgres
volumes:
- ./postgres_data:/var/lib/postgresql
ports:
- 5432:5432
将我的 Docker 从 WSL 2
降级到 WSL 1
以及 Thomas Taylor's pertaining, I solved the issue by using named volume.
后,我遇到了同样的问题
version: '3.8'
services:
postgres:
image: timescale/timescaledb:latest-pg12
...
volumes:
- pgdata:/var/lib/postgresql/data
...
volumes:
pgdata:
我的 docker 安装在 Windows 中。我正在尝试安装 this 应用程序。它给了我以下 docker-compose.yml 文件:
version: '2'
services:
web:
build:
context: .
dockerfile: Dockerfile-nginx
ports:
- "8085:80"
networks:
- attendizenet
volumes:
- .:/usr/share/nginx/html/attendize
depends_on:
- php
php:
build:
context: .
dockerfile: Dockerfile-php
depends_on:
- db
- maildev
- redis
volumes:
- .:/usr/share/nginx/html/attendize
networks:
- attendizenet
php-worker:
build:
context: .
dockerfile: Dockerfile-php
depends_on:
- db
- maildev
- redis
volumes:
- .:/usr/share/nginx/html/attendize
command: php artisan queue:work --daemon
networks:
- attendizenet
db:
image: postgres
environment:
- POSTGRES_USER=attendize
- POSTGRES_PASSWORD=attendize
- POSTGRES_DB=attendize
ports:
- "5433:5432"
volumes:
- ./docker/pgdata:/var/lib/postgresql/data
networks:
- attendizenet
maildev:
image: djfarrelly/maildev
ports:
- "1080:80"
networks:
- attendizenet
redis:
image: redis
networks:
- attendizenet
networks:
attendizenet:
driver: bridge
安装一切顺利,但 PostgreSQL 容器在启动后停止,并出现以下错误。
2018-03-07 08:24:47.927 UTC [1] FATAL: data directory "/var/lib/postgresql/data" has wrong ownership
2018-03-07 08:24:47.927 UTC [1] HINT: The server must be started by the user that owns the data directory
来自 Docker Hub 的一个简单的 PostgreSQL 容器运行顺利,但是当我们尝试将卷附加到容器时发生错误。
我是docker的新手,所以请忽略错误的术语用法。
容器内 postgres 中数据文件夹的所有者是 Postgres 用户。您当前的用户可能没有安装文件夹的访问权限。您需要根据以下给定命令的要求授予所有权限:
chmod 777 ./docker/pgdata
如果此命令无法帮助解决此问题,请参考以下内容link 进行从容器内部到容器外部的用户映射。
https://docs.docker.com/engine/security/userns-remap/#prerequisites
这是 Windows [1][2][3][4] 上 Postgres Docker 图像的记录问题。目前,似乎没有办法将 Windows 目录正确挂载为卷。您可以改用持久的 Docker 卷,例如:
db:
image: postgres
environment:
- POSTGRES_USER=attendize
- POSTGRES_PASSWORD=attendize
- POSTGRES_DB=attendize
ports:
- "5433:5432"
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- attendizenet
volumes:
pgdata:
其他无效的东西:
- 将 PGDATA 设置为子目录(参见 PGDATA Setting)
environment:
- PGDATA=/var/lib/postgresql/data/mnt
volumes:
- ./pgdata:/var/lib/postgresql/data
- 使用绑定安装 (docker-compose 3.2)
volumes:
- type: bind
source: ./pgdata
target: /var/lib/postgresql/data
- 运行 作为 POSTGRES_USER=root
更多信息:
GitHub
Docker 论坛
即使我遇到了问题,我也不得不定期复制数据目录。
docker cp <container-name>:/var/lib/postgresql/data C:/docker/volumes/postgres
请参考 reinierkors 在 here 中的回答。为了 reader 的方便和对我有用
,答案如下从 link 复制而来我通过将我的本地卷一个目录映射到 Postgres 需要的目录下解决了这个问题:
version: '3'
services:
postgres:
image: postgres
restart: on-failure
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- PGDATA=/var/lib/postgresql/data/pgdata
- POSTGRES_DB=postgres
volumes:
- ./postgres_data:/var/lib/postgresql
ports:
- 5432:5432
将我的 Docker 从 WSL 2
降级到 WSL 1
以及 Thomas Taylor's pertaining, I solved the issue by using named volume.
version: '3.8'
services:
postgres:
image: timescale/timescaledb:latest-pg12
...
volumes:
- pgdata:/var/lib/postgresql/data
...
volumes:
pgdata: