I am trying to install a PostgreSQL dockerised service, with plpython. I am able to build the image successfully, but when I come to run the container, I get the following error:
ERROR: could not open extension control file "/usr/share/postgresql/9.5/extension/plpython3u.control": No such file or directory STATEMENT: CREATE EXTENSION "plpython3u"; psql:/docker-entrypoint-initdb.d/create_db.sql:7: ERROR: could not open extension control file "/usr/share/postgresql/9.5/extension/plpython3u.control": No such file or directory
me@yourbox:~/Projects/experimental/docker/scratchdb$ tree
.
├── Dockerfile
└── sql
├── create_db.sql
└── schemas
└── DDL
└── db_schema_foo.sql
FROM library/postgres:9.6
FROM zitsen/postgres-pgxn
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
python3 postgresql-plpython3-9.6
RUN pgxn install quantile
COPY sql /docker-entrypoint-initdb.d/
# Add VOLUMEs to allow backup of config, logs and databases
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
# Set the default command to run when starting the container
# CMD ["/usr/lib/postgresql/9.6/bin/postgres", "-D", "/var/lib/postgresql/9.6/main", "-c", "config_file=/etc/postgresql/9.6/main/postgresql.conf"]
# Uncomment line below for debugging purposes
set client_min_messages TO debug1;
CREATE EXTENSION "quantile"
CREATE EXTENSION "plpython3u";
-- Create myappuser
CREATE ROLE myappuser LOGIN ENCRYPTED PASSWORD 'passw0rd123' NOINHERIT;
CREATE DATABASE only_foo_and_horses WITH ENCODING 'UTF8' TEMPLATE template1;
-- \l+
GRANT ALL PRIVILEGES ON DATABASE only_foo_and_horses TO myappuser;
-- Import only_foo_and_horses DDL and initialise database data
\c only_foo_and_horses;
\i /docker-entrypoint-initdb.d/schemas/DDL/db_schema_foo.sql;
-- # enable python in database
[[Edit]]
These are the commands I use to build and run the container:
docker build -t scratch:pg .
docker run -it -rm scratch:pg
How do I install plpython in a dockerised PostgreSQL service?
I think your error was because of the initial erroneous CMD
which pointed to the wrong location of PostgreSQL for this image (9.5 vs 9.6).
However, I think I've spotted the mistake for why the SQL isn't being imported.
The default ENTRYPOINT
for this image (at https://github.com/docker-library/postgres/blob/bef8f02d1fe2bb4547280ba609f19abd20230180/9.6/docker-entrypoint.sh) is responsible for importing from /docker-entrypoint-initdb.d/
. Since you are overwriting CMD
and it is not equal to just postgresql
, it is skipping this part.
The default ENTRYPOINT
should do what you want. Try removing your CMD
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With