Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Docker container shuts down giving 'data directory has wrong ownership' error when executed in windows 10

Tags:

I have my docker installed in Windows. I am trying to install this application. It has given me the following docker-compose.yml file:

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 

All the installation goes well, but the PostgreSQL container stops after starting for a moment giving following error.

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 

A simple PostgreSQL container from Docker Hub works smoothly, but the error occurs when we try to attach a volume to the container.

I am new to docker, so please ignore usage of terms wrongly.

like image 275
sphinx Avatar asked Mar 07 '18 09:03

sphinx


People also ask

How do I fix Docker has permission denied issue Windows?

Restarting the Docker Engine If running elevated Docker commands does not fix the permission denied error, verify that your Docker Engine is running. Similar to running a docker command without the sudo command, a stopped Docker Engine triggers the permission denied error.

Where is var lib postgresql data?

This optional variable can be used to define another location - like a subdirectory - for the database files. The default is /var/lib/postgresql/data .

Does Docker have persistent storage?

Docker has two options for containers to store files on the host machine, so that the files are persisted even after the container stops: volumes, and bind mounts. Docker also supports containers storing files in-memory on the host machine. Such files are not persisted.


2 Answers

This is a documented problem with the Postgres Docker image on Windows [1][2][3][4]. Currently, there doesn't appear to be a way to correctly mount Windows directories as volumes. You could instead use a persistent Docker volume, for example:

  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: 

Other things that didn't work:

  • Set PGDATA to a subdirectory (See PGDATA Setting)
    environment:       - PGDATA=/var/lib/postgresql/data/mnt     volumes:       - ./pgdata:/var/lib/postgresql/data 
  • Use a Bind Mount (docker-compose 3.2)
    volumes:       - type: bind         source: ./pgdata         target: /var/lib/postgresql/data 
  • Running as POSTGRES_USER=root

More Information:

GitHub

  • data directory "/var/lib/postgresql/data" has wrong ownership

Docker Forums

  • postgresql-data-pgdata-has-wrong-ownership
  • postgres-to-work-on-persistent-windows-mount
like image 132
Thomas Taylor Avatar answered Sep 16 '22 21:09

Thomas Taylor


Please refer reinierkors' answer from here. The answer is as follows copied as is from the link here for reader's convenience and works for me

I solved this by mapping my local volume one directory below the one Postgres needs:

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 
like image 28
suchitra nair Avatar answered Sep 18 '22 21:09

suchitra nair