postgresqldocker-composefiwarefiware-wirecloud

Docker compose fiware WireCloud data persistance not loaded from volume


I am using a docker container for my FiWare WireCloud. It is working properly but when I stop my container with docker compose down and restart it with docker compose up all my data are erased even if I specified a volume for the postgresql database and I have the following error:

ERROR:  relation "wirecloud_workspace" does not exist at character 370

If I want to make it work again, I have to recreate the whole database from scratch (initdb & createsuperuser)

What I would like to do is to be able to save my wirecloud data inside a volume and be able te backup it and reload it. Here is my current docker-compose.yml file in version 3:

version: '3.3'
services:

    iot-mongo:
        image: mongo:3.2
        ports:
         - "27017:27017"
        volumes:
            - ./data/mongo:/data/db

    orion:
      image: fiware/orion:1.9.0
      links:
        - iot-mongo
      ports:
        - "1026:1026"
      command: -dbhost iot-mongo


    nginx:
        restart: always
        image: nginx:1.13
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
            - ./nginx/sites-available:/etc/nginx/sites-available
            - ./letsencrypt/well-known:/www/letsencrypt
            - /etc/letsencrypt/:/etc/letsencrypt/
            - wirecloudwww:/var/www/static
            - wirecloudinstance:/opt/wirecloud_instance
        links:
            - wirecloud:wirecloud
            - orion:orion
    postgres:
        restart: always
        image: postgres:latest
        ports:
            - "5432:5432"
        volumes:
            - postgresdata:/var/lib/postgresql
        environment:
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD:
            POSTGRES_DB: postgres
            PGDATA: /tmp
    wirecloud:
        restart: always
        image: fiware/wirecloud:1.0-composable
        links:
            - postgres:postgres
        volumes:
            - wirecloudwww:/var/www/static
            - wirecloudinstance:/opt/wirecloud_instance
    volumes:
        wirecloudwww: {}
        wirecloudinstance: {}
        postgresdata: {}

I also tried with docker-compose v1 like they show in the documentation but the result is the same.


Solution

  • The problem is the definition of the postgres volume and the PGDATA environment variable. The PGDATA environment is telling PostgreSQL to store data in /tmp, so it is not going to store data inside de volume (you can create a volume on /tmp, but this seems a bit strange). If you remove the PGDATA environment variable, postgres will store data into /var/lib/postgresql/data. Using this definition for the postgres service should do the trick:

    postgres:
        restart: always
        image: postgres:latest
        ports:
            - "5432:5432"
        volumes:
            - postgresdata:/var/lib/postgresql/data
        environment:
            POSTGRES_USER: postgres
            POSTGRES_PASSWORD:
            POSTGRES_DB: postgres