Instance postgresql à la demande avec Docker

MàJ du 14/03/2014 : Quelques modifications sur le fichier source. Je devrais ptet trouver un moyen d'insérer un gist dans le blog.

Mais qu'est-ce que je l'apprécie ce docker ! De plus en plus, il s'immisce dans mes usages, d'autant plus qu'il me permet d'avoir les outils dont j'ai besoin facilement, rapidement et surtout de manière complètement isolée de mon système qui reste, du coup et en théorie, propre et léger.

Dernièrement j'avais envie de tester une appli rails choppée sur github, configurée par défaut avec postgresql. Or je n'ai pas de serveur sur ma machine, et pas forcément l'envie d'en ajouter un qui ‘polluerait’ encore un peu plus mon système.

Ma dernière trouvaille en date dans l’index docker (une vraie mine d'or) : une image permettant de lancer un service postgresql. La ‘recette’ donnée par l'auteur est assez simple, quelques commandes à taper et hop, une instance postgresql dispo !

Cependant je voulais quelque chose de plus direct, comme si je lançais un service sur ma machine sans pour autant l'installer et le gérer comme tel. Alors j'ai conçu un petit script à la sauce init.d selon les préconisations de l'auteur de l'image par l'utilisation d'un dossier local rattaché à un data-only container qui est configurable en début de script.

Toutes ces bases appartient (à nous ?) à l'utilisateur docker qui est admin du serveur, alors j'ai ajouté dans mon .(bas|zs)hrc les variables d'environnement suivantes :

export PGHOST=localhost
export PGUSER=docker
export PGPASSWORD=docker

Il me suffit alors de taper psql pour avoir accès à mon instance locale, ou même directement utiliser un classique rake db:create && rake db:migrate d'une application rails pour que les bases soient créées et alimentée.

Alors bien sûr, il y a toujours moyen de faire mieux ou d'être plus générique, mais pour le moment, ça me suffit comme cela. Pull requests accepted, as usual!

#!/usr/bin/env bash

PGSQL_DATA_PATH='/data/pg'
SERVER_CONTAINER='postgresql-server'
DATA_CONTAINER='postgresql-data'

function getStatus(){
    CONTAINER_ID=$(docker ps -a | grep -v Exit | grep $SERVER_CONTAINER | awk '{print $1}')
    if [[ -z $CONTAINER_ID ]] ; then
        echo 'Not running.'
        return 1
    else
        echo 'Running in container: $CONTAINER_ID'
        return 0
    fi
}

case '$1' in
    start)
        if [ ! -d $PGSQL_DATA_PATH ]; then
            mkdir -p $PGSQL_DATA_PATH
        fi

        docker ps -a | grep -q $DATA_CONTAINER
        if [ $? -ne 0 ]; then
            docker run --name $DATA_CONTAINER -v $PGSQL_DATA_PATH:/data ubuntu /bin/bash
        fi

        docker ps -a | grep -v Exit | grep -q $SERVER_CONTAINER
        if [ $? -ne 0 ]; then
            CONTAINER_ID=$(docker run -d -p 5432:5432 --volumes-from $DATA_CONTAINER \
                --name $SERVER_CONTAINER kamui/postgresql)
        fi
        getStatus
        ;;

    status)
        getStatus
        ;;

    stop)
        CONTAINER_ID=$(docker ps -a | grep -v Exit | grep $SERVER_CONTAINER | awk '{print $1}')
        if [[ -n $CONTAINER_ID ]] ; then
            SRV=$(docker stop $CONTAINER_ID)
            SRV=$(docker rm $CONTAINER_ID)
            if [ $? -eq 0 ] ; then
                echo 'Stopped.'
                DATA=$(sudo docker ps -a | grep $DATA_CONTAINER |  awk '{print $1}')
                DATA=$(sudo docker rm $DATA)
            fi
        else
            echo 'Not Running.'
            exit 1
        fi
        ;;

    *)
        echo 'Usage: `basename $0`  {start|stop|status}'
        exit 1
        ;;
esac

exit 0