1

I'm trying to do data persistence in postgres. But when I want to mount the data folder into my local file, I get this error.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
LOG:  could not link file "pg_xlog/xlogtemp.25" to "pg_xlog/000000010000000000000001": Operation not permitted
FATAL:  could not open file "pg_xlog/000000010000000000000001": No such file or directory
child process exited with exit code 1
initdb: removing contents of data directory "/var/lib/postgresql/data"
running bootstrap script ...

Here's my YAML file

version: '3.1'

services:

  postgres:
    restart: always
    image: postgres:9.6.4-alpine
    ports:
      - 8100:5432
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: root

I'm using docker toolbox on windows. The docker machine in Virtual Box.

2 Answers 2

1

It looks like you use a shared data directory (host dir shared into the virtual) for database storage.

Only two options make sense:

1) you have a trivial issue with directory permissions

2) you hit a known problem (google!) with some VirtualBox and also VmWare versions that on some Windows versions, you cannot create symlinks in directories shared from the host to virtual machine.

for (2), a workaround is to NOT use shared folder to keep data.

Either way, it's a problem which should be solved by the provider of the docker image itself, or by the provider of virtualizer (vbox, vmware etc).

This is NOT a fault of Windows OS, or PostgreSQL.

Sign up to request clarification or add additional context in comments.

1 Comment

This problem exists even on linux hosts with 16-alpine (latest atm), even some seven years after this post.
1

Looks like it has to be /mnt/sda1/var/lib/docker/volumes/psql/_data for windows docker toolbox. This worked for me

docker run -it --name psql -p 5432:5432 -v psql:/var/lib/postgresql/data postgres:9.5-alpine

"Mounts": [
            {
                "Type": "volume",
                "Name": "psql",
                "Source": "/mnt/sda1/var/lib/docker/volumes/psql/_data",
                "Destination": "/var/lib/postgresql/data",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }

docker volume ls

DRIVER              VOLUME NAME
local               65f253d220ad390337daaacf39e4d17000c36616acfe1707e41e92ab26a6a23a
local               761f7eceaed5525b70d75208a1708437e0ddfa3de3e39a6a3c069b0011688a07
local               8a42268e965e6360b230d16477ae78035478f75dc7cb3e789f99b15a066d6812
local               a37e0cf69201665b14813218c6d0441797b50001b70ee51b77cdd7e5ef373d6a
local               psql

Please refer this for more info: bad mount

1 Comment

so you did docker volume create psql and it worked?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.