piątek, 30 września 2016

Run PostgreSQL using Docker with persistent data on Windows 10

Hello :-),

Recently I try too learn docker and how to use it, because I want to use it on my team.

For start I only need this as development environment on developers local machine. The task was simple, for now I just need start PostgreSQL and Redis, there are plenty information on the Internet how to start those containers and how to prepare docker-compose to start those two services, but there was ONE BIG PROBLEM I want my database data to be persistent so after we setup database and insert data and machine restarts or shutdown data will not be lost.

Well, the problem began..

I was not able to find one clear way of doing this on Windows.. I use docker version 1.12 for Windows.



 So I created this docker-compose.yml file after some articles. I try to persist data on the host machine...

So I start it with docker-compose up and both services: postgres and redis started and I was able to access it and create database with data, I was so happy when I run command docker-compose down and once again docker-compose up and saw that my database still exists without recreating!! Yes!!

I was little suprised that folder on my host C:\Users\Łukasz\dbdata which I put in docker-compose file was epty, I thougt that there should be some postgresql files in it...

But it works so propably my task was over..... not so fast, I need to restart my Windows, and after this I was suprised after launch docker-compose up.. my database with data was gone :-(.

Ok So I will try to read how to mount folder from host machine to docker containr in Windows. so I ended with this error data directory "/var/lib/postgresql/data" has wrong ownership and for now I gave up trying to mount volume on host machine.

So I go with this steps when I try to mount volume on host machine on Windows:

1. I share my C: and D: drive in docker settings


2. As a credential I put username with computer name RISCOLAP\Łukasz or using ip address like this: 10.0.75.1\Łukasz, when we put just username we are not enable to list shared folders.

3. Next I create folder data on my C: drive and put file on this
4. After this when I run command docker run --rm -v c:/Users:/data alpine ls /data I saw my file


5. I try to start postgres container with my host volume: At start everything was looking really good. Folder on my host was filled with postgresql files!!
And then I saw this error on console :-(, and my joy was over.

waiting for server to start....FATAL: data directory "/var/lib/postgresql/data" has wrong ownership HINT: The server must be started by the user that owns the data directory.

For now I do not find answer how to deal with this error. So for now I stop trying mount host folder as volume.

And I found working solution with docker volume without host volumes. So first we need to create volume with and then using this volume I create my docker-compose file like this:
And it works!! I can now restart my machine, shut down, and my data are safe!!! If you want more technical info I put some links I was reading during my searching of the solution:

4 komentarze:

  1. One word of caution... if that setup doesn't respect fsync calls issued by Postgres then you're likely to end up with corruption if the image (or the host) crashes. So don't store anything critical in it. :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Hi, Thank you for your comment. Like you suggest this setup is not for critical data and this why I only think to use this setup on development environment or testing but not on production.

      Usuń
  2. Thanks man! I was on point to give up docker because of this same error, you save the day haha

    OdpowiedzUsuń