Unable to create postgis extension into postgres docker's image - postgresql

I'm trying to create postgis extension into postgres docker image.
Dockerfile:
FROM postgres:9.6.4
RUN apt-get clean \
&& apt-get update \
&& apt-get -y install postgis \
&& rm -rf /var/lib/apt/lists/*
COPY ./scripts/postgis.sh /docker-entrypoint-initdb.d/postgis.sh
postgis.sh:
#!/bin/sh
for DB in $(psql -t -c "SELECT datname from pg_database where datname = 'backend'"); do
echo "Loading PostGIS extensions into $DB"
"${psql[#]}" --dbname="$DB" <<-'EOSQL'
CREATE EXTENSION IF NOT EXISTS postgis;
EOSQL
done
I configure the user and password into a file.yaml. I can access to the database however the extension was not created.
I followed some solutions mentioned in some questions which are similar to this question but they didn't solve my problem. What's the fault that I commited or missed?

The postgis package you've installed doesn't actually include the postgis extension. The contents of that package are:
root#934775e6cf67:/# dpkg -L postgis
/.
/usr
/usr/share
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/raster2pgsql.1.gz
/usr/share/man/man1/shp2pgsql.1.gz
/usr/share/man/man1/pgsql2shp.1.gz
/usr/share/doc
/usr/share/doc/postgis
/usr/share/doc/postgis/changelog.Debian.gz
/usr/share/doc/postgis/NEWS.Debian.gz
/usr/share/doc/postgis/changelog.gz
/usr/share/doc/postgis/copyright
/usr/share/doc/postgis/README.Debian
/usr/share/doc/postgis-doc
/usr/share/doc/postgis-doc/README.postgis.gz
/usr/bin
/usr/bin/pgsql2shp
/usr/bin/raster2pgsql
/usr/bin/shp2pgsql
So those are support tools for postgis, but not the extension itself. You need to install the postgresql-9.6-postgis-2.4 package. Once this is installed, I can successfully run the create extension postgis command.

Related

Cannot use ST_GeomFromGeoJSON even when JSON-C is installed

I have a Postgres database with the Postgis extension created on it.
I want to use the ST_GeomFromGeoJSON function. The docs state:
If you do not have JSON-C enabled, you will get an error notice instead of seeing an output. To enable JSON-C, run configure --with-jsondir=/path/to/json-c. See Section 2.2.3, “Build configuration” for details.
So I ensure that I have JSON-C installed and I configure Postgis with it...
# install json-c
curl -L --output /tmp/json-c.tar.gz https://s3.amazonaws.com/json-c_releases/releases/json-c-0.10-nodoc.tar.gz
tar -xvf /tmp/json-c.tar.gz -C /tmp/
mkdir -p /var/lib/include
cp -r /tmp/json-c-0.10 /var/lib/include/json-c
# install postgis
curl https://download.osgeo.org/postgis/source/postgis-3.0.3.tar.gz -o ./postgis-3.0.3.tar.gz \
&& tar xvzf postgis-3.0.3.tar.gz
# configure postgis
cd /tmp/postgis-3.0.3
./configure --without-raster --with-jsondir=/var/lib \
&& make \
&& make install
then, I run the following in the database
postgres=# create extension postgis;
CREATE EXTENSION
postgres=# select ST_GeomFromGeoJSON('{"type": "Point", "coordinates": [0,0]}');
ERROR: You need JSON-C for ST_GeomFromGeoJSON
Why am I getting that error? I am including JSON-C when I am configure postgis, no? Am I missing something in my installation steps?
Postgres: 12.7
Postgis: 3.0.3
It turns out I was installing json-c incorrectly. When I installed it like so:
apt-get install libjson-c-dev
and used the following with ./configure:
--with-jsondir=/usr
it worked.
you can see that json-c headers are installed at /usr/include/json-c
ls /usr/include/json-c
arraylist.h json_c_version.h json_object_iterator.h linkhash.h
bits.h json.h json_object_private.h printbuf.h
debug.h json_inttypes.h json_tokener.h random_seed.h
thus, /usr becomes your --with-jsondir
Can you run SELECT PostGIS_Full_Version();
postgis_full_version
POSTGIS="3.0.0dev r17211" [EXTENSION] PGSQL="110" GEOS="3.8.0dev-CAPI-1.11.0 df24b6bb" SFCGAL="1.3.6" PROJ="Rel. 5.2.0, September 15th, 2018"
GDAL="GDAL 2.3.2, released 2018/09/21" LIBXML="2.9.9" LIBJSON="0.13.1" LIBPROTOBUF="1.3.1" WAGYU="0.4.3 (Internal)" TOPOLOGY RASTER
(1 row)
It will show if LIBJSON is integrated. Try upgrading to the next service pack version of postgis

There is no cubedata.h and contrib directory in Postgresql

I has 128-dimensional vectors of float (face recognition issue). To store these vectors I use datatype cube in Postgresql.
This type has limit by default - 100 dim.
In the psql (PostgreSQL) 10.5 (Ubuntu 10.6-0ubuntu0.18.04.1) this limit don't work: I can store my vector without any problems.
But yeasterday one of my machine was updated to PostgreSQL 10.6 and now I receive an error when try to add new cube-vector into my database. Error about too long vector.
To resolve this problem I have to change this limit in the file cubedata.h which is in contrib directory. But I have no this file and such directory at all!
I try install
sudo apt-get install postgresql-contrib
but, I get the message about the newest postgresql-contrib version is already installed.
After I tried to manually download cubedata.h file into the directory of Postgresql (/usr/share/postgresql/10/extension/), but it doesn't help.
My be someone encountered with such problem?
In Ubuntu 18.04.1 cubedata.h included in the postgres-server-dev-10 package from the PostgreSQL official repository. But prebuilt cube.so included in the postgresql-10 package with default limit.
To increase the limit you should recompile cube.so from source. Below the example of code for the Ubuntu.
Add repository:
PG_VER=10.6
source /etc/os-release
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
echo "deb http://apt.postgresql.org/pub/repos/apt/ ${VERSION_CODENAME}-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt-get update
sudo apt-get install -y postgresql-${PG_VER%.*}
Compile cube extension from source:
PG_VER=10.6
sudo apt-get install -y unzip gcc make zlib1g-dev libreadline-dev postgresql-server-dev-${PG_VER%.*} bison flex
wget https://ftp.postgresql.org/pub/source/v${PG_VER}/postgresql-${PG_VER}.tar.bz2 --quiet -O postgresql.tar.bz2
tar xvf postgresql.tar.bz2
cd postgresql-${PG_VER}
./configure
cd contrib/cube
sed -i 's/#define CUBE_MAX_DIM (100)/#define CUBE_MAX_DIM (128)/' cubedata.h
make USE_PGXS=1
sudo make USE_PGXS=1 install
Check result after restart server:
sudo -u postgres psql dbname -c 'CREATE EXTENSION cube'
sudo -u postgres psql dbname -c 'SELECT cube_dim(cube(array(select generate_series(1, 128)))) as dim'

Enable Postgis extension Postgres in Dockerfile

How can i enable the Postgis extension in a Dockerfile? The Postgres installation is already working
this is the command in Ubuntu:
sudo -u postgres psql -c "CREATE EXTENSION postgis;"
My Dockerfile:
# Set the base image to Ubuntu
FROM ubuntu:14.04
# Update the repository sources list
RUN apt-get update -y
################## BEGIN INSTALLATION ######################
# Postgres with Postgis
# Install wget
RUN apt-get install wget -y
# Setup Postgres repository
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Add Postgres repository
RUN sh -c "echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" >> /etc/apt/sources.list.d/postgresql.list"
# Update repository
RUN apt-get update -y
# Install Postgres with Postgis
RUN apt-get install postgresql-9.3-postgis-2.1 -y
# Change rights for start Postgresql
RUN chmod +x /etc/init.d/postgresql
# Start Postgresql
CMD service postgresql start && tail -F /var/lib/postgresql/data/serverlog
The solution for enable an extension
# Enable Postgis
RUN service postgresql start \
&& sudo -u postgres psql -c "CREATE EXTENSION postgis;"
RUN service postgresql stop
If you see other Dockerfiles using that psql -c command, like apache/marmotta Dockerfile, you will see lines like:
RUN service postgresql start \
&& psql --command "CREATE USER $DB_USER WITH PASSWORD '$DB_PASS';" \
&& psql --command "CREATE DATABASE $DB_NAME WITH OWNER $DB_USER;"
USER root
RUN service postgresql stop
In other words, you need to make sure the postgresql service is running for those commands to succeed.

How to create postgis extension for postgresql in docker?

I'm getting errors when trying to create postgis extensions.
Here is what my dockerfile looks like.
from postgres
RUN apt-get update && apt-get install postgis -y
ADD /create_postgis_extension.sh /docker-entrypoint-initdb.d/
create.bla-bla..sh
#!/bin/sh
POSTGRES="gosu postgres postgres"
$POSTGRES --single -E <<EOSQL
CREATE EXTENSION postgis;
CREATE EXTENSION postgis_topology;
EOSQL
And here is the error when running the image
backend> statement: CREATE EXTENSION postgis;
ERROR: type addbandarg[] does not exist
STATEMENT: CREATE EXTENSION postgis;
backend> statement: CREATE EXTENSION postgis_topology;
backend> ERROR: required extension "postgis" is not installed
I'm doing something wrong obviously, but I don't know what.
Why is postgis in not installed if I've installed postgis with apt-get.
---DOCKERFILE
FROM postgres:12.4
RUN apt-get update \
&& apt-get install wget -y \
&& apt-get install postgresql-12-postgis-3 -y \
&& apt-get install postgis -y
COPY ./db.sql /docker-entrypoint-initdb.d/
--- db.sql (in this same folder)
CREATE EXTENSION postgis;
I am using CentOS rather than Debian but ran into the same problem. The solution basically came down to using pg_ctl to start/stop postgres.
sudo -u postgres pg_ctl start -w -D ${PGDATA}
sudo -u postgres createdb postgis_template -E UTF8
sudo -u postgres psql -d postgis_template -c "create extension if not exists postgis;"
sudo -u postgres pg_ctl stop -w
It is possible that you installed the wrong version of postgis for that postgres?
addbang[] exists from version 2.1.0, there was an issue around that between 2.0 and 2.1.
RedHat family has less of those issues due their behavior of getting updates less frequently (who go slow...)
That being said.
The docker-entrypoint-initdb.d is managed by docker-entrypoint.sh internal script , this runs only when the PGDATA folder do NOT exists.
This init script is able to manage some files: .sh, .sql and .sql.tar.gz.
Those are executed in alphabetic order by docker's user postgres.
Rather than use sh to do sql, use sql.
create_postgis_extension.sql:
CREATE EXTENSION IF NOT EXISTS POSTGIS;
CREATE EXTENSION IF NOT EXISTS POSTGIS_TOPOLOGY;
clean&simple
Regards.

Postgresql 9.2 pg_dump version mismatch

I am trying to dump a Postgresql database using the pg_dump tool.
$ pg_dump books > books.out
How ever i am getting this error.
pg_dump: server version: 9.2.1; pg_dump version: 9.1.6
pg_dump: aborting because of server version mismatch
The --ignore-version option is now deprecated and really would not be a a solution to my issue even if it had worked.
How can I upgrade pg_dump to resolve this issue?
Check the installed version(s) of pg_dump:
find / -name pg_dump -type f 2>/dev/null
My output was:
/usr/pgsql-9.3/bin/pg_dump
/usr/bin/pg_dump
There are two versions installed. To update pg_dump with the newer version:
sudo ln -s /usr/pgsql-9.3/bin/pg_dump /usr/bin/pg_dump --force
This will create the symlink to the newer version.
I encountered this while using Heroku on Ubuntu, and here's how I fixed it:
Add the PostgreSQL apt repository as described at "Linux downloads (Ubuntu)
". (There are similar pages for other operating systems.)
Upgrade to the latest version (9.3 for me) with:
sudo apt-get install postgresql
Recreate the symbolic link in /usr/bin with:
sudo ln -s /usr/lib/postgresql/9.3/bin/pg_dump /usr/bin/pg_dump --force
The version number in the /usr/lib/postgresql/... path above should match the server version number in the error you received. So if your error says, pg_dump: server version: 9.9, then link to /usr/lib/postgresql/9.9/....
Macs have a builtin /usr/bin/pg_dump command that is used as default.
With the postgresql install you get another binary at /Library/PostgreSQL/<version>/bin/pg_dump
You can just locate pg_dump and use the full path in command
locate pg_dump
/usr/bin/pg_dump
/usr/bin/pg_dumpall
/usr/lib/postgresql/9.3/bin/pg_dump
/usr/lib/postgresql/9.3/bin/pg_dumpall
/usr/lib/postgresql/9.6/bin/pg_dump
/usr/lib/postgresql/9.6/bin/pg_dumpall
Now just use the path of the desired version in the command
/usr/lib/postgresql/9.6/bin/pg_dump books > books.out
You can either install PostgreSQL 9.2.1 in the pg_dump client machine or just copy the $PGHOME from the PostgreSQL server machine to the client machine. Note that there is no need to initdb a new cluster in the client machine.
After you have finished installing the 9.2.1 software, remember to edit some environment variables in your .bash_profile file.
If you're on Ubuntu, you might have an old version of postgresql-client installed. Based on the versions in your error message, the solution would be the following:
sudo apt-get remove postgresql-client-9.1
sudo apt-get install postgresql-client-9.2
If you have docker installed you can do something like:
$ docker run postgres:9.2 pg_dump books > books.out
That will download the Docker container with Postgres 9.2 in it, run pg_dump inside of the container, and write the output.
On Ubuntu you can simply add the most recent Apt repository and then run:
sudo apt-get install postgresql-client-11
Every time you upgrade or re install a new version of PostgreSQL, a latest version of pg_dump is installed.
There must be a PostgreSQL/bin directory somewhere on your system, under the latest version of PostgreSQL that you've installed ( 9.2.1 is latest) and try running the
pg_dump from in there.
For those running Postgres.app:
Add the following code to your .bash_profile:
export PATH=/Applications/Postgres.app/Contents/Versions/latest/bin:$PATH
Restart terminal.
For Macs with Homebrew. I had this problem when fetching the db from Heroku. I've fixed it just running:
brew upgrade postgresql
For mac users
put to the top of .profile file.
export PATH="/Applications/Postgres.app/Contents/MacOS/bin:$PATH"
then run
. ~/.profile
An alternative answer that I don't think anyone else has covered.
If you have multiple PG clusters installed (as I do), then you can view those using pg_lsclusters.
You should be able to see the version and cluster from the list displayed.
From there, you can then do this:
pg_dump --cluster=9.6/main books > books.out
Obviously, replace the version and cluster name with the appropriate one for your circumstances from what is returned by pg_lsclusters separating the version and cluster with a /. This targets the specific cluster you wish to run against.
For me the issue was updating psql apt-get wasn't resolving newer versions, even after update. The following worked.
Ubuntu
Start with the import of the GPG key for PostgreSQL packages.
sudo apt-get install wget ca-certificates
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Now add the repository to your system.
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
Install PostgreSQL on Ubuntu
sudo apt-get update
sudo apt-get install postgresql postgresql-contrib
https://www.postgresql.org/download/linux/ubuntu/
As explained, this is because your postgresql is in old version -> update it
For Mac via homebrew:
brew tap petere/postgresql,
brew install <formula> (eg: brew install petere/postgresql/postgresql-9.6)
Remove old postgre:
brew unlink postgresql
brew link -f postgresql-9.6
If any error happen, don't forget to read and follow brew instruction in each step.
Check this out for more: https://github.com/petere/homebrew-postgresql
The answer sounds silly but if you get the above error and wanna run the pg_dump for earlier version go to bin directory of postgres and type
./pg_dump servername > out.sql ./ ignores the root and looks for pg_dump in current directory
I had same error and this is how I solved it in my case.
This means your postgresql version is 9.2.1 but you have started postgresql service of 9.1.6.
If you run psql postgres you will see:
psql (9.2.1, server 9.1.6)
What I did to solve this problem is:
brew services stop postgresql#9.1.6
brew services restart postgresql#9.2.1
Now run psql postgres and you should have: psql (9.2.1)
You can also run brew services list to see the status of your postgres.
This worked for me, a collection of solutions from above and other sites. If you specified a version like postgressql-client-11 before then you need to remove that version first.
sudo apt-get remove -y postgresql-client
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y postgresql-client-12
I was facing the same issue. I used docker instead of upgrading pg_dump.
run following command to create a Docker container of postgres 14.2, or any other version as you like.
sudo docker run --name mac_postgres -p 5444:5432 -e POSTGRES_PASSWORD=password -d postgres:14.2
Then take dump using following command. Note: you should change the host, port, username and password according to your actual database credentials.
sudo docker exec -it mac_postgres pg_dump --host=xxxxx0.b.db.ondigitalocean.com --port=250xx --username=doadmin --dbname=test --password > out.sql
After entering password. Your dump will be ready in out.sql file. Then you can delete the docker-container.
sudo docker stop mac_postgres
sudo docker rm mac_postgres
If you're using Heroku's Postgres.app the pg_dump (along with all the other binaries) is in /Applications/Postgres.app/Contents/MacOS/bin/
so in that case it's
ln -s /Applications/Postgres.app/Contents/MacOS/bin/pg_dump /usr/local/bin/pg_dump
or
ln -s /Applications/Postgres.app/Contents/MacOS/bin/* /usr/local/bin/.
to just grab them all
** after install postgres version is match(9.2)
Create a symbolic link or new shortcut
**- on '/usr/bin'
syntag is = sudo ln -s [path for use] [new shortcut name]
example
sudo ln -s /usr/lib/postgresql/9.2/bin/pg_dump new_pg_dump
-- how to call : new_pg_dump -h 192.168.9.88 -U postgres database
Try that:
export PATH=/usr/local/bin:$PATH
If the database is installed on a different machine it has probably correct version of pg_dump installed. This means that you can execute pg_dump command remotely with SSH:
ssh username#dbserver pg_dump books > books.out
You can also use public key authentication for passwordless execution. Steps to achieve that:
Generate (if not yet done) a pair of keys with ssh-keygen command.
Copy the public key to the database server, usually ~/.ssh/authorized_keys.
Test if the connection works with ssh command.
Well, I had the same issue as I have two postgress versions installed.
Just use the proper pg_dump and you don't need to change anything, in your case:
$> /usr/lib/postgresql/9.2/bin/pg_dump books > books.out
For macs, use find / -name pg_dump -type f 2>/dev/null find the location of pg_dump
For me, I have following results:
Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dump
/usr/local/Cellar/postgresql/9.4.5_2/bin/pg_dump
If you don't want to use sudo ln -s new_pg_dump old_pg_dump --force, just use:
Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dump to replace with pg_dump in your terminal
For example:
Applications/Postgres.app/Contents/Versions/9.5/bin/pg_dump books > books.out
It works for me!
On my scenario the production version was 12, and my development version was 11, upgrading the package postgresql-client-xx was enough to solve my incident.
Reference web page : https://www.postgresql.org/download/linux/ubuntu/
sudo apt-get update && sudo apt-get -y upgrade postgresql-client
One interest thing to point out is that after the upgrade the previous version kept installed :
mlazo#mlazo-pc:~$ dpkg -l |grep -i postgresql-client
ii postgresql-client-11 11.8-1.pgdg18.04+1 amd64 front-end programs for PostgreSQL 11
ii postgresql-client-12 12.4-1.pgdg18.04+1 amd64 front-end programs for PostgreSQL 12
Hope my experience would be helpful to someone.
Greetings,
I had the same message, for me it was that I had to adjust the following:
export LD_LIBRARY_PATH=/usr/pgsql-12/lib:....
export LD_RUN_PATH=/usr/pgsql-12/lib:.....
First step: see if postgres has a repository with prebuilt binaries for the version you want for your OS: https://www.postgresql.org/download/
If that doesn't work (for instance if your distro is there but is no longer supported, so correct binaries aren't provided for it), or if you just want to go straight or the source and not have to worry about adding remote repo's, etc.
What I did is download the raw source of postgres for the desired version.
Untar it, cd into it, build it ./configure && make, then:
postgresql-12.3 $ find . -name pg_dump
./src/bin/pg_dump/pg_dump
$ ./src/bin/pg_dump/pg_dump
unable to load libpg.so.5 # if it says this...
$ find . -name libpg.so.5
$ export LD_LIBRARY_PATH=/your/path/to/the/shared/dir/of/above/file
$ ./src/bin/pg_dump/pg_dump # works now
Now you have access to any version that builds on your box. Which should be any.
Full steps tutorial
Your local version needs to match the one used by AWS on the remote server.
Unfortunately, apt-get install will lag behind the official release.
So you need to proceed the following way:
sudo apt-get remove postgresql
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
Then check your error message should be something like
pg_dump: server version: 12.3; pg_dump version: 10.16 (Ubuntu 10.16-0ubuntu0.18.04.1)
So it means you want version 12 (and not 13), for the install of the matching version by specifying the version number (without minor) during your fresh install:
sudo apt-get -y install postgresql-12
Now it works:
pg_dump -h {{endpoint}} -U {{username}} -f dump.sql {{tablename}}
NB: You get the endpoint in Connectivity & security go to https://us-east-2.console.aws.amazon.com/rds/home?region=us-east-2 and click on your DB instance
For Ubuntu 20.04 with the "official" postgresql repo, moving from pg12 to pg13, I had to do this:
sudo apt purge postgresql-12
This was very hard for me to pinpoint. I had played with a variety of these packages:
postgresql-client
postgresql-client-common
postgresql-##
postgresql-client-##
postgresql-server-dev-##
pgadmin