在Windows 10中执行时,Docker容器关闭,给出“数据目录拥有错误的所有权”错误

dfddblmv  于 2022-11-28  发布在  Docker
关注(0)|答案(6)|浏览(217)

我在Windows中安装了我的Docker。我正在尝试安装this应用程序。它给了我以下的docer-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容器可以顺利工作,但当我们尝试将卷附加到容器时会发生错误。
我是新来的码头,所以请忽略错误的术语用法。

0pizxfdo

0pizxfdo1#

这是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论坛

6tdlim6h

6tdlim6h2#

请参考reinierkors从here的答案。答案如下所示,为方便读者,从这里的链接复制,并为我工作
我通过将本地卷的一个目录Map到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
mkshixfv

mkshixfv3#

我有同样的问题后,降级我的Docker从WSL 2WSL 1和什么Thomas Taylor的有关,我解决了这个问题,使用named volume

version: '3.8'

services:
  postgres:
    image: timescale/timescaledb:latest-pg12
    ...
    volumes:
      - pgdata:/var/lib/postgresql/data
    ...

volumes:
  pgdata:
jdg4fx2g

jdg4fx2g4#

将本地卷(例如C:\docker\pgdata)Map到PostgreSQL所需的上一级(一个目录)。您也可以在启动docker时从命令行执行此操作:

docker run -itd -e POSTGRES_USER=pguser -e POSTGRES_PASSWORD=pgpasswd \
  -e PGDATA=/var/lib/postgresql/data/pgdata -p 5432:5432 \
  -v c:\docker\pgdata:/var/lib/postgresql --name postgresql postgres
3pvhb19x

3pvhb19x5#

即使我有这个问题,我也必须定期复制数据目录。

docker cp <container-name>:/var/lib/postgresql/data C:/docker/volumes/postgres
jqjz2hbq

jqjz2hbq6#

容器内postgres中数据文件夹的所有者是Postgres用户。您的当前用户可能没有已装载文件夹的访问权限。您需要通过以下给定命令根据要求授予所有权限:

chmod 777 ./docker/pgdata

如果此命令不能帮助解决此问题,请参考以下链接以执行从容器内部到容器外部的用户Map。
https://docs.docker.com/engine/security/userns-remap/#prerequisites

相关问题