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:

其他无效的东西:

    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: