14

I have the following docker compose file:

version: "3"
services:
  postgres:
    image: postgres:11.2-alpine
    environment:
      POSTGRES_PASSWORD: root
      POSTGRES_USER: root
    ports:
      - "5432:5432"
    volumes:
      - ./init-db/init-db.sql:/docker-entrypoint-initdb.d/init.sql

This is the init-db.sql:

CREATE TABLE users (
    email VARCHAR(355) UNIQUE NOT NULL,
    password VARCHAR(256) NOT NULL
);

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    title VARCHAR(100) NOT NULL,
    price NUMERIC(6, 2) NOT NULL,
    category INT NOT NULL
);

INSERT INTO users VALUES ('test@test.com', 'Test*123');
INSERT INTO products (title, price, category) VALUES ('Truco', 9.90, 13);

When I run docker-compose up, I'm getting this error:

server started
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
/docker-entrypoint-initdb.d/init.sql: Permission denied

I already tried to:

  • chmod 777 on the sql file
  • chmod -x on the sql file
  • Run docker and docker-compose using sudo

Any idea?

Ben-hur Ott
  • 189
  • 1
  • 1
  • 8

6 Answers6

3

I found the easy way to solve this...
You should use "build" way to create postgres service
And DO NOT setting the volume for init.sql, it will cause the permission problem.

    postgres:
        build: ./postgres

Create a Dockerfile for postgres like this

FROM postgres:12
COPY ./init.sql /docker-entrypoint-initdb.d/init.sql
CMD ["docker-entrypoint.sh", "postgres"]

Then it should works out. Hope my answer would help you!

3

For me problem was in my machine. enabled SELinux access control, which did not allow for containers to expand files.

Solution, disable SELinux:

echo SELINUX=disabled > /etc/selinux/config
SELINUXTYPE=targeted >> /etc/selinux/config
setenforce 0

From this

  • I hate that this worked...But yeah, this is what was causing my issue when running a docker-compose file from linux. Didn't have the permission denied issues on Windows host. – Ebsan Mar 07 '22 at 17:18
  • Link in last did wonder for me... https://blog.amet13.name/2017/02/permission-denied-docker-volume.html – B L Gupta Oct 30 '22 at 18:02
3

I had a similar problem when using the ADD command.

When using ADD (eg to download a file) the default chmod value is 711. When using the COPY command the chmod will match the hosts chmod of the file where you copy it from. The solution is to set the permission before copying, or change them in your Dockerfile after they've been copied.

It looks like there will finally be a "COPY --chmod 775" flag available in the upcoming docker 20 which will make this easier.

https://github.com/moby/moby/issues/34819

When the sql file in /docker-entrypoint-initdb.d/ has a permission of 775 then the file is run correctly.

You can test this within the image (override entrypoint to /bin/bash) using: docker-entrypoint.sh postgres

user3559338
  • 410
  • 3
  • 6
1

I have same problem on my macOS, but it's OK on my ubuntu laptop. I found the problem is that MacOS cannot let docker access the folder. Following link may resolve your problem. https://stackoverflow.com/a/58482702/10752354

Besides, in my case, I should add one line code in my init.sql file because the default database is "root", and I should change "root" database into "postgres" database, or in your case for another custom database instead of root.

> docker-compose exec db psql -U root
psql (13.0 (Debian 13.0-1.pgdg100+1))
Type "help" for help.

root=# \l
                             List of databases
   Name    | Owner | Encoding |  Collate   |   Ctype    | Access privilege
s 
-----------+-------+----------+------------+------------+-----------------
--
 postgres  | root  | UTF8     | en_US.utf8 | en_US.utf8 | 
 root      | root  | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | root  | UTF8     | en_US.utf8 | en_US.utf8 | =c/root         
 +
           |       |          |            |            | root=CTc/root
 template1 | root  | UTF8     | en_US.utf8 | en_US.utf8 | =c/root         
 +
           |       |          |            |            | root=CTc/root
(4 rows)

so I need to add \c postgres in my init.sql file:

\c postgres    // for creating table in the database named 'postgres'

create table sample_table. ( ... )
Johnson
  • 41
  • 1
  • 5
0

I tried with the following compose file and it seems working as expected. are you sure form the path of the files you use?

version: "3"
services:
  postgres:
    image: postgres:11.2-alpine
    environment:
      POSTGRES_PASSWORD: root
      POSTGRES_USER: root
    ports:
      - "5432:5432"
    volumes:
      - ./init-db.sql:/docker-entrypoint-initdb.d/init.sql

files structure

drwxr-xr-x   4 shihadeh  502596769   128B Feb 28 22:37 .
drwxr-xr-x  12 shihadeh  502596769   384B Feb 28 22:36 ..
-rw-r--r--   1 shihadeh  502596769   244B Feb 28 22:37 docker-compose.yml
-rw-r--r--   1 shihadeh  502596769   380B Feb 28 22:37 init-db.sql

output of docker-compose up

postgres_1  | The files belonging to this database system will be owned by user "postgres".
postgres_1  | This user must also own the server process.
postgres_1  |
postgres_1  | The database cluster will be initialized with locale "en_US.utf8".
postgres_1  | The default database encoding has accordingly been set to "UTF8".
postgres_1  | The default text search configuration will be set to "english".
postgres_1  |
postgres_1  | Data page checksums are disabled.
postgres_1  |
postgres_1  | fixing permissions on existing directory /var/lib/postgresql/data ... ok
postgres_1  | creating subdirectories ... ok
postgres_1  | selecting default max_connections ... 100
postgres_1  | selecting default shared_buffers ... 128MB
postgres_1  | selecting dynamic shared memory implementation ... posix
postgres_1  | creating configuration files ... ok
postgres_1  | running bootstrap script ... ok
postgres_1  | performing post-bootstrap initialization ... sh: locale: not found
postgres_1  | 2020-02-28 21:45:01.363 UTC [26] WARNING:  no usable system locales were found
postgres_1  | ok
postgres_1  | syncing data to disk ... ok
postgres_1  |
postgres_1  | Success. You can now start the database server using:
postgres_1  |
postgres_1  |     pg_ctl -D /var/lib/postgresql/data -l logfile start
postgres_1  |
postgres_1  |
postgres_1  | WARNING: enabling "trust" authentication for local connections
postgres_1  | You can change this by editing pg_hba.conf or using the option -A, or
postgres_1  | --auth-local and --auth-host, the next time you run initdb.
postgres_1  | waiting for server to start....2020-02-28 21:45:02.272 UTC [30] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2020-02-28 21:45:02.294 UTC [31] LOG:  database system was shut down at 2020-02-28 21:45:01 UTC
postgres_1  | 2020-02-28 21:45:02.299 UTC [30] LOG:  database system is ready to accept connections
postgres_1  |  done
postgres_1  | server started
postgres_1  | CREATE DATABASE
postgres_1  |
postgres_1  |
postgres_1  | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
postgres_1  | CREATE TABLE
postgres_1  | CREATE TABLE
postgres_1  | INSERT 0 1
postgres_1  | INSERT 0 1
postgres_1  |
postgres_1  |
postgres_1  | waiting for server to shut down....2020-02-28 21:45:02.776 UTC [30] LOG:  received fast shutdown request
postgres_1  | 2020-02-28 21:45:02.779 UTC [30] LOG:  aborting any active transactions
postgres_1  | 2020-02-28 21:45:02.781 UTC [30] LOG:  background worker "logical replication launcher" (PID 37) exited with exit code 1
postgres_1  | 2020-02-28 21:45:02.781 UTC [32] LOG:  shutting down
postgres_1  | 2020-02-28 21:45:02.826 UTC [30] LOG:  database system is shut down
postgres_1  |  done
postgres_1  | server stopped
postgres_1  |
postgres_1  | PostgreSQL init process complete; ready for start up.
postgres_1  |
postgres_1  | 2020-02-28 21:45:02.890 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
postgres_1  | 2020-02-28 21:45:02.890 UTC [1] LOG:  listening on IPv6 address "::", port 5432
postgres_1  | 2020-02-28 21:45:02.895 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres_1  | 2020-02-28 21:45:02.915 UTC [43] LOG:  database system was shut down at 2020-02-28 21:45:02 UTC
postgres_1  | 2020-02-28 21:45:02.921 UTC [1] LOG:  database system is ready to accept connections

Al-waleed Shihadeh
  • 2,697
  • 2
  • 8
  • 22
0

Just adding my solution even when it is a little late:

My problem:

I am installing the source files from an udemy course:

https://github.com/rockthejvm/spark-essentials

We have 2 important things here:

Docker compose file: docker-compose.yml

Folder and sql file to do db initialization: ./sql/bd.sql

I downloaded the zip file to my Ubuntu 20.04

When doing docker-compose up, I got the error:

Attaching to postgres

postgres | ls: cannot open directory '/docker-entrypoint-initdb.d/': Permission denied

postgres exited with code 2

SOLUTION

Before running doccker-compose up do:

run chmod 777 ON FOLDER called sql that contains file db.sql

chmod 777 sql

Explanation:

The folder called sql contains file db.sql to init the database from inside the docker container so, we need to give the permissions to run the file inside folde called sql.

I think you only need to do as below.

Give permisions to your folder:

chmod 777 init-db

be sure your sql file can be read by all users:

chmod 666 init-db.sql

Carlos Kassab
  • 21
  • 1
  • 6