{"id":8797,"date":"2021-09-23T08:40:40","date_gmt":"2021-09-23T07:40:40","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=8797"},"modified":"2026-03-11T09:52:02","modified_gmt":"2026-03-11T08:52:02","slug":"containeriser-une-base-de-donnees-postgresql-avec-docker","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/","title":{"rendered":"Containeriser PostgreSQL avec Docker !"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8797&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8797&#038;title=Containeriser%20PostgreSQL%20avec%20Docker%20%21\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Containeriser%20PostgreSQL%20avec%20Docker%20%21&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8797\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-10775\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/conteneurs-300x200.jpg\" alt=\"\" width=\"300\" height=\"200\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/conteneurs-300x200.jpg 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/conteneurs.jpg 605w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Bonjour,<\/p>\n<p>Depuis quelques ann\u00e9es maintenant, nous avons vu arriver dans le milieu de l&#8217;informatique, le ph\u00e9nom\u00e8ne de &#8220;containerisation&#8221; !<\/p>\n<p>C&#8217;est quoi au juste ! Et qu&#8217;est ce qui change par rapport \u00e0 la virtualisation ?<\/p>\n<p>On va dire que c&#8217;est un peu, comparativement, des concepts d&#8217;architecture qui se diff\u00e9rencient comme peuvent l&#8217;\u00eatre le Paas et le Iaas.\u00a0 Toute la question est qu&#8217;est ce qui est inclut dans chaque couche !<\/p>\n<p>&nbsp;<\/p>\n<h1>Principes<\/h1>\n<p>&nbsp;<\/p>\n<p>Une VM englobe un OS, ses librairies (DLL windows, rpm\/pkg linux), avec son sch\u00e9ma d&#8217;architecture stockage et les applications install\u00e9es et embarqu\u00e9es.<br \/>\nDocker, avec la containerisation, ne prend en charge que l&#8217;environnement applicatif. En quelque sorte, avec Docker, vous n&#8217;avez besoin que d&#8217;une solution logiciel avec toutes les biblioth\u00e8ques n\u00e9cessaires, utiles \u00e0 son bon fonctionnement, qui seront inclus dans le container que vous d\u00e9ploierez \u00e0 ce moment pr\u00e9cis.<\/p>\n<p>Rien de mieux que des sch\u00e9mas pour visualiser concr\u00e8tement le concept. Nous prendrons comme exemple, ces 2 croquis issus du site <a href=\"http:\/\/www.docker.com\">http:\/\/www.docker.com<\/a>.<\/p>\n<p>Voici le sch\u00e9ma d&#8217;architecture d&#8217;une virtualisation classique comme nous la connaissons sur une infra HyperV, par exemple :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8800\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/container-vm-whatcontainer_2-300x240.png\" alt=\"\" width=\"300\" height=\"240\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/container-vm-whatcontainer_2-300x240.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/container-vm-whatcontainer_2-1024x818.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/container-vm-whatcontainer_2-768x614.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/container-vm-whatcontainer_2.png 1198w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>L&#8217;hyperviseur prend en charge 1 ou plusieurs VM qui elle(s) m\u00eame(s) comporte(nt) des couches OS et applicatives. Ainsi &#8220;n&#8221; OS seront d\u00e9ploy\u00e9s en fonction des &#8220;n&#8221; VM g\u00e9r\u00e9es par l&#8217;hyperviseur.<\/p>\n<p>&nbsp;<\/p>\n<p>Avec Docker, nous avons le sch\u00e9ma suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-8801\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/docker-containerized-appliction-blue-border_2-300x240.png\" alt=\"\" width=\"300\" height=\"240\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/docker-containerized-appliction-blue-border_2-300x240.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/docker-containerized-appliction-blue-border_2-1024x818.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/docker-containerized-appliction-blue-border_2-768x614.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/docker-containerized-appliction-blue-border_2.png 1198w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Nous voyons que nous n&#8217;avons qu&#8217;un seul OS sur l&#8217;h\u00f4te. Celui ci comporte un processus syst\u00e8me appel\u00e9 &#8220;Docker Engine&#8221; qui se chargera de communiquer avec les containers. Chaque container docker contiendra son application embarqu\u00e9e avec les d\u00e9pendances n\u00e9cessaires (compilateurs C, librairies, packages auxiliaires &#8230;..).<br \/>\nMais l&#8217;OS de la machine h\u00f4te, de son cot\u00e9, pourra ne contenir qu&#8217;un ensemble de packages et biblioth\u00e8ques natives et donc, ne pas embarquer diff\u00e9rents packages suppl\u00e9mentaires.<\/p>\n<h3>Les avantages :<\/h3>\n<p>Les principaux avantages que l&#8217;on pourra retenir vis \u00e0 vis de Docker et de la containerisation :<\/p>\n<ul>\n<li>1 seul OS, celui ci est capable de g\u00e9rer l&#8217;ensemble des containers fonctionnant sur la machine.<\/li>\n<li>la simplicit\u00e9, l&#8217;utilisateur peut d\u00e9ployer un ensemble de containers d\u00e9j\u00e0 pr\u00e9-packag\u00e9s ou en cr\u00e9er un via un &#8220;dockerfile&#8221;<\/li>\n<li>R\u00e9duire le temps d&#8217;installation, pas d&#8217;OS dans l&#8217;image d&#8217;un container.<\/li>\n<li>La portabilit\u00e9. Des backup\/restauration d&#8217;images de containers tr\u00e8s rapides avec seulement l&#8217;applicatif embarqu\u00e9e dans une image.<\/li>\n<li>Scalabilit\u00e9 avec possibilit\u00e9 de cr\u00e9er de multiples environnements identiques avec 1 seule image (tr\u00e8s pratique pour cr\u00e9er un environnement UAT \u00e0 partir d&#8217;un environnement de production)<\/li>\n<li>Docker garantit maintenant un fonctionnement sur une grande partie des OS (Linux, Windows, Mac).<\/li>\n<li>Linux g\u00e8re cet ensemble de containers via le syst\u00e8me LXC (LinuX Container) qui permet une parfaite isolation de chaque container au sein du m\u00eame OS.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3>Quelques inconv\u00e9nients :<\/h3>\n<ul>\n<li>A l&#8217;origine, Docker ne fonctionnait que sur Linux. Il fallait monter un environnement virtualis\u00e9 type &#8220;boot2docker&#8221; pour fonctionner sur Mac ou Windows. A pr\u00e9sent, Windows sait g\u00e9rer Docker avec les derni\u00e8res version de Windows.<\/li>\n<li>Il est n\u00e9cessaire d&#8217;installer la couche Docker Engine sur la machine h\u00f4te, ce qui peut \u00eatre un frein pour certains clients ne maitrisant pas ce type de produit.<\/li>\n<li>Toutes les applications ne sont pas &#8220;container compliance&#8221;, en outre, qu&#8217;en est-il d&#8217;une base de donn\u00e9es Oracle avec 200To de donn\u00e9es ? Et pour le patching de type one-off ?<\/li>\n<li>Puisque les containers partagent le m\u00eame OS, ils partagent donc les m\u00eames composants physiques. Qu&#8217;en est-il d&#8217;un ph\u00e9nom\u00e8ne de &#8220;out of memory&#8221; ou d&#8217;un &#8220;stack overflow&#8221; ? Dans un environnement virtualis\u00e9, chaque VM comporte son OS qui g\u00e8re sa m\u00e9moire propre, avec Docker les applications se &#8220;partagent&#8221; \u00e9galement le m\u00eame noyau.<\/li>\n<li>En cas de virus sur la machine h\u00f4te, c&#8217;est toute l&#8217;architecture Docker et des containers qui est impact\u00e9e, surtout si le virus s&#8217;attaque \u00e0 une partie vitale de l&#8217;OS\/!\\<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Installation sous Linux<\/h1>\n<p>Nous partons d&#8217;une VM de type EC2 AWS. C&#8217;est un Red Hat Linux RHEL version 8.2 qui est install\u00e9 sur celle ci<\/p>\n<p>&nbsp;<\/p>\n<pre>$ cat \/etc\/*relea*\r\nNAME=\"Red Hat Enterprise Linux\"\r\nVERSION=\"8.2 (Ootpa)\"\r\nID=\"rhel\"\r\nID_LIKE=\"fedora\"\r\nVERSION_ID=\"8.2\"\r\nPLATFORM_ID=\"platform:el8\"\r\nPRETTY_NAME=\"Red Hat Enterprise Linux 8.2 (Ootpa)\"\r\nANSI_COLOR=\"0;31\"\r\nCPE_NAME=\"cpe:\/o:redhat:enterprise_linux:8.2:GA\"\r\nHOME_URL=\"https:\/\/www.redhat.com\/\"\r\nBUG_REPORT_URL=\"https:\/\/bugzilla.redhat.com\/\"<\/pre>\n<p>&nbsp;<\/p>\n<p>La premi\u00e8re \u00e9tape consiste \u00e0 installer la couche Docker. Cette op\u00e9ration installera la partie serveur avec le processus &#8220;Docker Engine&#8221;, c&#8217;est un &#8220;runtime environnement&#8221; qui fera tourner l&#8217;ensemble des containers. Puis la partie gestion des diff\u00e9rents containers. Ceux ci communiqueront avec l&#8217;OS via le &#8220;Docker Engine&#8221;.<\/p>\n<p>Afin de simplifier au mieux cette installation, nous partirons des d\u00e9p\u00f4ts Docker que nous enregistrerons sur la machine via &#8220;yum-config&#8221;.<\/p>\n<pre># <strong>yum-config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo<\/strong>\r\nAdding repo from: https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo<\/pre>\n<p>Une fois charg\u00e9 dans les sources, nous pourrons lancer l&#8217;installation des packages suivants :<\/p>\n<pre># <strong>yum install docker-ce docker-ce-cli containerd.io<\/strong><\/pre>\n<pre>=================================================================================================================================================================\r\nPackage Architecture Version Repository Size\r\n=================================================================================================================================================================\r\nInstalling:\r\ncontainerd.io x86_64 1.4.9-3.1.el8 docker-ce-stable 30 M\r\ndocker-ce x86_64 3:20.10.8-3.el8 docker-ce-stable 22 M\r\ndocker-ce-cli x86_64 1:20.10.8-3.el8 docker-ce-stable 29 M\r\nInstalling dependencies:\r\ncontainer-selinux noarch 2:2.164.1-1.module+el8.4.0+11870+8b6f7018 rhel-8-appstream-rhui-rpms 52 k\r\ndocker-ce-rootless-extras x86_64 20.10.8-3.el8 docker-ce-stable 4.6 M\r\ndocker-scan-plugin x86_64 0.8.0-3.el8 docker-ce-stable 4.2 M\r\nfuse-common x86_64 3.2.1-12.el8 rhel-8-baseos-rhui-rpms 21 k\r\nfuse-overlayfs x86_64 1.6-1.module+el8.4.0+11822+6cc1e7d7 rhel-8-appstream-rhui-rpms 73 k\r\nfuse3 x86_64 3.2.1-12.el8 rhel-8-baseos-rhui-rpms 50 k\r\nfuse3-libs x86_64 3.2.1-12.el8 rhel-8-baseos-rhui-rpms 94 k\r\niptables x86_64 1.8.4-10.el8_2.1 rhel-8-baseos-rhui-rpms 581 k\r\nlibcgroup x86_64 0.41-19.el8 rhel-8-baseos-rhui-rpms 70 k\r\nlibnetfilter_conntrack x86_64 1.0.6-5.el8 rhel-8-baseos-rhui-rpms 65 k\r\nlibnfnetlink x86_64 1.0.1-13.el8 rhel-8-baseos-rhui-rpms 33 k\r\nlibnftnl x86_64 1.1.5-4.el8 rhel-8-baseos-rhui-rpms 83 k\r\nlibslirp x86_64 4.3.1-1.module+el8.4.0+11822+6cc1e7d7 rhel-8-appstream-rhui-rpms 69 k\r\npolicycoreutils-python-utils noarch 2.9-9.el8 rhel-8-baseos-rhui-rpms 251 k\r\nslirp4netns x86_64 1.1.8-1.module+el8.4.0+11822+6cc1e7d7 rhel-8-appstream-rhui-rpms 51 k\r\nEnabling module streams:\r\ncontainer-tools rhel8<\/pre>\n<p>&nbsp;<\/p>\n<p>V\u00e9rifier la bonne installation de Docker sur la machine :<\/p>\n<pre># <strong>docker version<\/strong>\r\nClient: Docker Engine - Community\r\nVersion: 20.10.8\r\nAPI version: 1.41\r\nGo version: go1.16.6\r\nGit commit: 3967b7d\r\nBuilt: Fri Jul 30 19:53:39 2021\r\nOS\/Arch: linux\/amd64\r\nContext: default\r\nExperimental: true<\/pre>\n<p>&nbsp;<\/p>\n<p>Puis d\u00e9marrer le process via systemctl<\/p>\n<p>&nbsp;<\/p>\n<pre># <strong>systemctl start docker<\/strong>\r\n# <strong>systemctl status docker<\/strong>\r\n\u25cf docker.service - Docker Application Container Engine\r\nLoaded: loaded (\/usr\/lib\/systemd\/system\/docker.service; disabled; vendor preset: disabled)\r\nActive: <span style=\"color: #339966;\">active (running)<\/span> since Wed 2021-09-15 14:05:28 UTC; 3s ago\r\nDocs: https:\/\/docs.docker.com\r\nMain PID: 21769 (dockerd)\r\nTasks: 7\r\nMemory: 78.7M\r\nCGroup: \/system.slice\/docker.service\r\n\u2514\u250021769 \/usr\/bin\/dockerd -H fd:\/\/ --containerd=\/run\/containerd\/containerd.sock<\/pre>\n<p>&nbsp;<\/p>\n<p>Votre syst\u00e8me est maintenant pr\u00eat \u00e0 accepter la containerisation<\/p>\n<p>&nbsp;<\/p>\n<h1>Et sur les autres OS<\/h1>\n<p>Comme \u00e9voqu\u00e9 plus haut, \u00e0 ses d\u00e9buts, Docker n&#8217;\u00e9tait compatible que sur Linux.<br \/>\nHeureusement, avec le temps, Microsoft en a permis l&#8217;utilisation de Docker sur sa plateforme Windows.<\/p>\n<p>Il vous suffira d&#8217;installer l&#8217;un des outils compatible avec Windows en fonction de votre utilisation.<\/p>\n<ul>\n<li><strong>Docker desktop<\/strong> , outil complet permettant de monter des containers Windows ou Linux.<\/li>\n<li><strong>VS Code<\/strong>, utilis\u00e9 pour un environnement de d\u00e9veloppement au sein d&#8217;un container<\/li>\n<li><strong>Visual Studio<\/strong> prend \u00e9galement en charge l&#8217;environnement Docker avec compatibilit\u00e9 Azure Container Registry.<\/li>\n<\/ul>\n<p>Les derni\u00e8res version de Windows 10 et Windows 2016 server embarquent une image Linux (ubuntu par exemple), le d\u00e9ploiement Docker se fera alors comme sur un serveur Linux classique, \u00e0 peu de chose pr\u00e8s.<\/p>\n<p>Pour MacOS :<\/p>\n<ul>\n<li>utiliser \u00e9galement <strong>Docker Desktop<\/strong> qui permet de monter des containers sur un environnement Mac.<\/li>\n<li><strong>boot2docker<\/strong> a \u00e9t\u00e9 le premier outil \u00e0 pouvoir g\u00e9rer Docker sous MacOS, mais celui ci n\u00e9cessitait de configurer une VM qui comportait un OS Linux + les applications packag\u00e9s.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>PostgreSQL sous Docker<\/h1>\n<p>Une fois notre installation Docker effectu\u00e9e, nous pouvons voir que, pour le moment, notre Docker Engine ne fait pas grand chose.<br \/>\nPar d&#8217;image container \u00e0 g\u00e9rer<\/p>\n<pre># <strong>docker images<\/strong>\r\nREPOSITORY TAG IMAGE ID CREATED SIZE<\/pre>\n<p>pas de processus container non plus<\/p>\n<pre># <strong>docker ps<\/strong>\r\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES<\/pre>\n<p>Nous pourrons alors d\u00e9buter la cr\u00e9ation de containers.<\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #3366ff;\">M\u00e9thodes<\/span><\/h4>\n<p>Nous avons plusieurs m\u00e9thodes nous permettant de construire des containers PostgreSQL.<\/p>\n<ul>\n<li>En allant chercher directement l&#8217;image la plus r\u00e9cente pr\u00e9sente sur les d\u00e9p\u00f4ts Docker. Une simple commande &#8220;<strong>docker pull postgres<\/strong>&#8221; suffira \u00e0 aller chercher cette image de PostgreSQL. En revanche, ce sera la toute derni\u00e8re version qui sera t\u00e9l\u00e9charger. En septembre 2021, il s&#8217;agit de PostgreSQL 13.4.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li>Il est possible de choisir l&#8217;image d&#8217;une version ant\u00e9rieure bien \u00e9videment.\u00a0 Pour cela, il faudra aller sur le site du <a href=\"https:\/\/hub.docker.com\/_\/postgres?tab=tags&amp;page=1&amp;ordering=last_updated\">Hub Docker<\/a> et t\u00e9l\u00e9charger la version voulue. En fait il suffit juste de choisir la version PG dans notre commande &#8220;<strong>docker pull<\/strong>&#8220;. Par exemple, pour une version 9.6, c&#8217;est &#8220;<strong>docker pull postgres:9.6<\/strong>&#8220;.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul>\n<li>Il sera \u00e9galement possible de configurer soi m\u00eame son image, gr\u00e2ce \u00e0 un fichier &#8220;<strong>dockerfile<\/strong>&#8220;. Ce fichier texte nous laissera le choix entre de nombreuses options de configurations pour notre instance PostgreSQL, et nous permettra m\u00eame de lancer des commandes de cr\u00e9ation de bases et\/ou r\u00f4les sur l&#8217;instance. Le <a href=\"https:\/\/hub.docker.com\/_\/postgres?tab=description&amp;page=1&amp;ordering=last_updated\">hub docker<\/a> propose \u00e9galement des exemples de <strong>dockerfile<\/strong>, mais vous pourrez en trouver sur <a href=\"https:\/\/github.com\/docker-library\/postgres\">github<\/a> ou autres sites communautaires.<br \/>\nVous pourrez \u00e9galement le &#8220;construire&#8221; vous m\u00eame en respectant certaines syntaxes pr\u00e9cises.<\/li>\n<\/ul>\n<h4><\/h4>\n<h4><span style=\"color: #3366ff;\">Installation simple<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p>Dans ce premier exemple, nous partirons d&#8217;une image pr\u00e9-packag\u00e9e directement extraite des d\u00e9p\u00f4ts linux Docker.<\/p>\n<p>Rien de plus simple :<\/p>\n<pre># <strong>docker run --name postgresql-container_test1 -p 5442:5432 -e POSTGRES_PASSWORD=test2021 -d postgres<\/strong>\r\nUnable to find image 'postgres:latest' locally\r\nlatest: Pulling from library\/postgres\r\na330b6cecb98: Pull complete\r\n3b0b899b4747: Pull complete\r\ncc0b2671a552: Pull complete\r\n1a7c7505993a: Pull complete\r\n02cdead79556: Pull complete\r\n0d8fbe9259d6: Pull complete\r\n974e6d476aa7: Pull complete\r\ne9abf0d5d0bc: Pull complete................\r\n..............<\/pre>\n<p>&nbsp;<\/p>\n<p>Et ce que l&#8217;on peut voir, avec le warning &#8220;<em>Unable to find image &#8216;postgres:latest&#8217; locally<\/em>&#8220;, c&#8217;est que le processus de lancement est capable d&#8217;aller directement chercher sur les d\u00e9p\u00f4ts Docker une image PostgreSQL qu&#8217;il pourra alors utiliser pour d\u00e9marrer notre container.<\/p>\n<p>L&#8217;option <strong>-p<\/strong> est utilis\u00e9 afin de changer le port par d\u00e9faut. Ici nous utiliserons cette instance sur le 5442. L&#8217;option <strong>-e<\/strong> permet d&#8217;ajouter des variables d&#8217;environnement en param\u00e8tres, comme ici le password du user &#8216;postgres&#8221;. L&#8217;option <strong>-d<\/strong> d\u00e9marre le container en mode &#8216;background&#8217;.<\/p>\n<p>Si le message suivant s&#8217;affiche, c&#8217;est que l&#8217;on a r\u00e9ussi le lancement de notre container<\/p>\n<h6><em>Digest: sha256:97e5e91582e89514277912d4b7c95bceabdede3482e32395bcb40099abd9c506<\/em><br \/>\n<em>Status: Downloaded newer image for postgres:latest<\/em><br \/>\n<em>c0214f610a796c34b526c54217f36e0e02c1e43753c7eb0363ffd8dc07abceba<\/em><\/h6>\n<p>La derni\u00e8re ligne nous donne l&#8217;ID crypt\u00e9 de notre processus container. Un &#8220;docker ps&#8221; permet de voir ce qui tourne<\/p>\n<pre># <strong>docker ps -a<\/strong>\r\nCONTAINER ID  IMAGE     COMMAND                 CREATED             STATUS         PORTS                                       NAMES\r\nc0214f610a79  postgres  \"docker-entrypoint.s\u2026\"  5 minutes ago       Up 5 minutes   0.0.0.0:5442-&gt;5432\/tcp, :::5442-&gt;5432\/tcp   postgresql-container_test1<\/pre>\n<p>&nbsp;<\/p>\n<p>Au prochain lancement d&#8217;un container PostgreSQL, avec cette m\u00eame image, il ne sera pas n\u00e9cessaire d&#8217;aller chercher les sources dans les d\u00e9p\u00f4ts. Cette image est maintenant enregistr\u00e9e dans le docker local.<\/p>\n<p>&nbsp;<\/p>\n<pre># <strong>docker images -a<\/strong>\r\nREPOSITORY    TAG      IMAGE ID       CREATED       SIZE\r\npostgres      latest   346c7820a8fb   12 days ago   315MB<\/pre>\n<p>Nous pourrons tester une connexion, via psql, sous le user &#8220;postgres&#8221;.<\/p>\n<pre># su - postgres\r\n$ psql -p 5442 -h 127.0.0.1\r\nPassword for user postgres: *******\r\npsql (13.0, server 13.4 (Debian 13.4-1.pgdg100+1))\r\nType \"help\" for help.\r\n\r\npostgres=# \\l\r\nList of databases\r\nName       | Owner    | Encoding | Collate    | Ctype      | Access privileges\r\n-----------+----------+----------+------------+------------+-----------------------\r\npostgres   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |\r\ntemplate0  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c\/postgres +\r\n           |          |          |            |            | postgres=CTc\/postgres\r\ntemplate1  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c\/postgres +\r\n           |          |          |            |            | postgres=CTc\/postgres\r\n(3 rows)<\/pre>\n<p>&nbsp;<\/p>\n<p>On peut voir que le &#8220;<strong>data_directory<\/strong>&#8221; est celui par d\u00e9faut pour une instance PostgreSQL. Et que notre version est la toute derni\u00e8re, \u00e0 savoir la 13.4 compil\u00e9e sur Debian !<\/p>\n<pre>postgres=# show data_directory;\r\ndata_directory\r\n--------------------------\r\n\/var\/lib\/postgresql\/data\r\n(1 row)\r\n\r\npostgres=# select version ();\r\nversion\r\n------------------------------------------------------------------------------------------------------------------\r\nPostgreSQL 13.4 (Debian 13.4-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit\r\n(1 row)<\/pre>\n<p>&nbsp;<\/p>\n<p>Mais sur notre machine, bien entendu, rien dans &#8220;\/var\/lib\/postgresql\/data&#8221; ! Les fichiers PostgreSQL sont dans le container directement.<\/p>\n<pre>[postgres@ip-172-44-2-96 ~]$ ls -l \/var\/lib\/postgresql\r\nls: cannot access '\/var\/lib\/postgresql': No such file or directory<\/pre>\n<p>On note la pr\u00e9sence d&#8217;un nouveau montage de type &#8220;overlay&#8221;. c&#8217;est le driver de stockage g\u00e9n\u00e9rique fonctionnant avec Docker (remplac\u00e9 par OverlayFS par la suite).<\/p>\n<pre>$ df -hT\r\nFilesystem Type Size Used Avail Use% Mounted on\r\n.....\r\noverlay overlay 10G 4.2G 5.8G 42% \/var\/lib\/docker\/overlay2\/50846bbd5d32162e138f91df136d7877fc33c7f2f17ef3e9c2d2de1704e7a190\/merged<\/pre>\n<p>&nbsp;<\/p>\n<p>C&#8217;est dans ce montage nomm\u00e9 &#8220;\/var\/lib\/docker\/overlay2\/50846bbd5d32162e138f91df136d7877fc33c7f2f17ef3e9c2d2de1704e7a190\/merged&#8217; que sont tous les packages syst\u00e8me n\u00e9cessaires uniquement \u00e0 notre instance PostgreSQL ainsi que ses fichiers bases de donn\u00e9es. Ce montage est pr\u00e9sent tant que notre container est d\u00e9marr\u00e9.<\/p>\n<h4><span style=\"color: #3366ff;\">Cr\u00e9er une image<\/span><\/h4>\n<p>Cette premi\u00e8re \u00e9tape nous a permis de cr\u00e9er un container PostgreSQL\u00a0 dans un temps tr\u00e8s court.<br \/>\nIl est bien sur possible de g\u00e9rer soi m\u00eame ce que l&#8217;on souhaite installer dans son container, sa version, les options &#8230;..<\/p>\n<p>Pour cela, nous allons cr\u00e9er un &#8220;<strong>dockerfile<\/strong>&#8220;. C&#8217;est un fichier texte que l&#8217;on utilisera pour la configuration de notre container.<br \/>\nDes exemples existent sur le site <a href=\"https:\/\/github.com\/docker-library\/postgres\">Github<\/a> que nous pourrons utiliser et modifier selon notre convenance.<\/p>\n<p>Nous naviguerons sur le site et irons copier le &#8220;<strong>dockerfile<\/strong>&#8221; que l&#8217;on souhaite en fonction de notre version. Par exemple, si nous souhaitons la version 11.13.<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-8811 size-full\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/image_11.13.jpg\" alt=\"\" width=\"956\" height=\"250\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/image_11.13.jpg 956w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/image_11.13-300x78.jpg 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/image_11.13-768x201.jpg 768w\" sizes=\"auto, (max-width: 956px) 100vw, 956px\" \/><\/p>\n<p>Nous chargerons les 2 fichiers. Tout d&#8217;abord &#8220;<strong>dockerfile<\/strong>&#8221; qui est le fichier appeler pour construire l&#8217;image, puis le &#8220;<strong>docker-entrypoint.sh<\/strong>&#8221; qui est le script lanc\u00e9 pour la partie configuration de l&#8217;application.<\/p>\n<p>Ces 2 fichiers sont au format txt et donc utilisable sur un \u00e9diteur de texte classique.<\/p>\n<pre># mkdir PG11 \r\n# cd PG11 \r\n# vi Dockerfile \r\n# vi docker-entrypoint.sh<\/pre>\n<p>Ne pas oublier de passer un chmod755 sur le fichier &#8220;<strong>docker-entrypoint.sh<\/strong>&#8220;, en effet, ce script est ex\u00e9cut\u00e9 \u00e0 chaque lancement de notre container Docker \/!\\<\/p>\n<p>Dans un &#8220;<strong>dockerfile<\/strong>&#8221; chaque instruction va commencer par un ordre \u00e0 interpr\u00e9ter. Les principaux ordres \u00e9tant les suivants :<\/p>\n<ul>\n<li><span style=\"color: #0000ff;\">FROM<\/span> : les sources que l&#8217;on prend pour construire notre image (ce peut \u00eatre une distribution linux, un package applicatif&#8230;.)<\/li>\n<li><span style=\"color: #0000ff;\">RUN<\/span> : l&#8217;action qui devra \u00eatre ex\u00e9cut\u00e9e (installer des packages, t\u00e9l\u00e9charger des sources &#8230;.)<\/li>\n<li><span style=\"color: #0000ff;\">ENV<\/span> : d\u00e9finir des variables d&#8217;environnement utilis\u00e9es durant le cycle de vie de construction de cette image.<\/li>\n<li><span style=\"color: #0000ff;\">CMD<\/span> : il s&#8217;agit de l&#8217;ex\u00e9cution par d\u00e9faut prise par le dockerfile, en quelque sorte la derni\u00e8re instruction \u00e0 effectuer.<\/li>\n<\/ul>\n<p>D&#8217;autres instructions facultatives peuvent apparaitre afin d&#8217;effectuer des actions bien pr\u00e9cises :<\/p>\n<ul>\n<li><span style=\"color: #0000ff;\">COPY<\/span> : faire une copie d&#8217;un fichier local vers l&#8217;image<\/li>\n<li><span style=\"color: #0000ff;\">VOLUME<\/span> : d\u00e9finir un FS d&#8217;installation pour notre container<\/li>\n<li><span style=\"color: #0000ff;\">ENTRYPOINT<\/span> : un argument \u00e0 ex\u00e9cuter lorsque notre container est lanc\u00e9 (ici nous ex\u00e9cuterons le script &#8220;<strong>docker-entrypoint.sh<\/strong>&#8220;)<\/li>\n<\/ul>\n<p>On pourra par exemple aller changer le r\u00e9pertoire du <strong>PGDATA<\/strong>, et le faire pointer vers &#8220;<span style=\"color: #993366;\">\/var\/lib\/postgresql\/11<\/span>&#8221; au lieu de &#8220;<span style=\"color: #3366ff;\">\/var\/lib\/postgresql\/data<\/span>&#8220;.<\/p>\n<pre><strong># vi Dockerfile<\/strong>\r\n.....\r\n<span style=\"color: #3366ff;\">ENV <span style=\"color: #000000;\">PGDATA \/var\/lib\/postgresql\/data<\/span><\/span>\r\n# this 777 will be replaced by 700 at runtime (allows semi-arbitrary \"--user\" values)\r\nRUN mkdir -p \"$PGDATA\" &amp;&amp; chown -R postgres:postgres \"$PGDATA\" &amp;&amp; chmod 777 \"$PGDATA\"\r\n<span style=\"color: #3366ff;\">VOLUME <span style=\"color: #000000;\">\/var\/lib\/postgresql\/data<\/span><\/span><\/pre>\n<p>par<\/p>\n<p>&nbsp;<\/p>\n<pre><span style=\"color: #993366;\"><span style=\"color: #0000ff;\">ENV<\/span> PGDATA \/var\/lib\/postgresql\/11<\/span>\r\n# this 777 will be replaced by 700 at runtime (allows semi-arbitrary \"--user\" values)\r\nRUN mkdir -p \"$PGDATA\" &amp;&amp; chown -R postgres:postgres \"$PGDATA\" &amp;&amp; chmod 777 \"$PGDATA\"\r\n<span style=\"color: #993366;\"><span style=\"color: #0000ff;\">VOLUME<\/span> \/var\/lib\/postgresql\/11<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>Dans le fichier &#8220;<strong>docker-entrypoint.sh&#8221;<\/strong>, nous pourrons d\u00e9finir l&#8217;option &#8220;<span style=\"color: #ff0000;\">data-checksums<\/span>&#8221; \u00e0 la cr\u00e9ation de l&#8217;instance.<br \/>\nNous allons aussi cr\u00e9er un r\u00f4le nomm\u00e9 &#8220;manu&#8221;, et une base de test pour notre instance dont le nom sera donn\u00e9 en param\u00e8tre.<\/p>\n<pre><strong># vi docker-entrypoint.sh<\/strong>\r\n....\r\n eval 'initdb --username=\"$POSTGRES_USER\" --pwfile=&lt;(echo \"$POSTGRES_PASSWORD\") '\"$POSTGRES_INITDB_ARGS\"' \"$@\"'\r\n\r\n<\/pre>\n<p>par<\/p>\n<pre> eval 'initdb --username=\"$POSTGRES_USER\" --pwfile=&lt;(echo \"$POSTGRES_PASSWORD\") <strong><span style=\"color: #ff0000;\">--data-checksums<\/span><\/strong> '\"$POSTGRES_INITDB_ARGS\"' \"$@\"'<\/pre>\n<p>&nbsp;<\/p>\n<p>et<\/p>\n<pre>docker_setup_db_manu() {\r\npsql -U ${POSTGRES_USER} -c \"CREATE ROLE \\\"${POSTGRES_USER_MANU}\\\" with LOGIN CREATEDB PASSWORD '${USER_MANU_PASS}';\" &gt;\/dev\/null\r\npsql -U ${POSTGRES_USER} -c \"CREATE DATABASE \\\"${DB_MANU}\\\" with owner '${POSTGRES_USER_MANU}';\" &gt;\/dev\/null\r\n}\r\n...\r\n file_env 'POSTGRES_USER_MANU' 'manu'\r\n file_env 'DB_MANU'\r\n<\/pre>\n<p>Sur cette base, nous y installerons l&#8217;extension &#8220;pg_cron&#8221;.<br \/>\nLa modification va se d\u00e9rouler en 3 \u00e9tapes, un peu comme cela peut \u00eatre fait sur une installation on-prem.<\/p>\n<ul>\n<li>Tout d&#8217;abord, t\u00e9l\u00e9charger et installer le package pr\u00e9sent sur les d\u00e9p\u00f4ts syst\u00e8me PGDG.<\/li>\n<li>configurer dans le fichier &#8220;postgresql.conf&#8221; les donn\u00e9es propres \u00e0 cette extension et \u00e0 son fonctionnement.<\/li>\n<li>cr\u00e9er celle ci directement sur la base souhait\u00e9e.<\/li>\n<\/ul>\n<p>Les modifications devront \u00eatre effectu\u00e9es sur nos 2 fichiers &#8220;<strong>Dockerfile<\/strong>&#8221; et &#8220;<strong>docker-entrypoint.sh&#8221;<\/strong><\/p>\n<p>Sur le &#8220;Dockerfile&#8221;, installer le package pour cette extension&#8221; :<\/p>\n<pre><strong># vi Dockerfile<\/strong>\r\n...\r\n<span style=\"color: #0000ff;\">FROM<\/span> debian:stretch-slim\r\n...\r\n<span style=\"color: #0000ff;\">RUN<\/span> set -ex; \\\r\n....\r\n apt-get install -y postgresql-11-cron;\\\r\n....<\/pre>\n<p>&nbsp;<\/p>\n<p>Cela va ajouter le package &#8220;postgresql-11-cron&#8221; dans notre image packag\u00e9e.<\/p>\n<p>C&#8217;est dans le fichier &#8220;<strong>docker-entrypoint.sh<\/strong>&#8221; que nous configurerons l&#8217;extension en base.<br \/>\nTout d&#8217;abord avec une proc\u00e9dure qui chargera dans le fichier &#8220;postgresql.conf&#8221; la configuration de notre extension. Le nom de la base ou sera install\u00e9e cette extension sera celui que l&#8217;on passera en param\u00e8tre.<\/p>\n<pre><strong># vi docker-entrypoint.sh<\/strong> ....\r\n<span style=\"color: #800000;\">docker_setup_pg_cron()<\/span> {\r\n   {\r\n   echo \"shared_preload_libraries = 'pg_cron'\"\r\n   } &gt;&gt; \"$PGDATA\/postgresql.conf\"\r\n   {\r\n   echo \"cron.database_name='${DB_MANU}'\"\r\n   } &gt;&gt; \"$PGDATA\/postgresql.conf\"\r\n}\r\n\r\n<\/pre>\n<p>Puis en la cr\u00e9ant directement dans cette base pass\u00e9e en param\u00e8tre.<\/p>\n<pre><span style=\"color: #800000;\">docker_setup_db_manu()<\/span> {\r\n....\r\npsql -U ${POSTGRES_USER} -d ${DB_MANU} -c \"CREATE EXTENSION pg_cron;\" &gt;\/dev\/null\r\n}<\/pre>\n<p>Les proc\u00e9dures &#8220;<span style=\"color: #800000;\">docker_setup_pg_cron()<\/span>&#8221;\u00a0 et &#8220;<span style=\"color: #800000;\">docker_setup_db_manu()&#8221; <\/span>seront appel\u00e9es dans la partie &#8220;main&#8221; de notre script &#8220;<strong>docker-entrypoint.sh<\/strong>&#8220;.<\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #3366ff;\">Construire l&#8217;image <\/span><\/h4>\n<p>&nbsp;<\/p>\n<p>La construction se fait \u00e0 partir du &#8220;<strong>dockerfile<\/strong>&#8220;<\/p>\n<pre># <strong>docker build . -t image_pg_11_manu <\/strong><\/pre>\n<p>Tout un environnement Linux debian est charg\u00e9, puis mis \u00e0 jour avec les derniers packages. Le <strong>-t<\/strong> permet de tagger notre image. A la fin de ce processus, nous devrions voir :<\/p>\n<pre>Successfully built f5ebf2fe8083\r\nSuccessfully tagged image_pg_11_manu:latest<\/pre>\n<p>Cela veut dire que notre image est cr\u00e9\u00e9e. Nous allons le v\u00e9rifier<\/p>\n<pre><strong># docker image ls<\/strong>\r\nREPOSITORY        TAG          IMAGE ID       CREATED          SIZE\r\nimage_pg_11_manu  latest       f5ebf2fe8083   29 seconds ago   283MB\r\npostgres          latest       346c7820a8fb   2 weeks ago      315MB\r\ndebian            stretch-slim 27a36d9cbe0f   2 weeks ago      55.3MB<\/pre>\n<p>Nous avons donc notre image nomm\u00e9e &#8220;image_pg_11_manu&#8221; qui est pr\u00eate. Notons que nous avons \u00e9galement conserver une partie des libraires propres \u00e0 Debian pour construire cette image.<\/p>\n<h4><span style=\"color: #3366ff;\">D\u00e9marrer le container<\/span><\/h4>\n<p>Nous passons au d\u00e9marrage du container \u00e0 partir de cette nouvelle image :<\/p>\n<pre># <strong>docker run --name postgresql11manu -itd --restart always --publish 5438:5432 -e \"POSTGRES_PASSWORD=<span style=\"color: #993366;\">test2021<\/span>\" -e \"DB_MANU=<span style=\"color: #993366;\">manudb<\/span>\" -e \"USER_MANU_PASS=<span style=\"color: #993366;\">test2021<\/span>\" image_pg_11_manu<\/strong>\r\n62a270bc27a71585208fd2223ee92fc6a4e49eceb11ea4cd6ad2cf383bd3103d<\/pre>\n<p>Un id d&#8217;op\u00e9ration nous est alors renvoy\u00e9 par la commande. Pour confirmer la cr\u00e9ation de ce container :<\/p>\n<pre># <strong>docker container ls<\/strong>\r\nCONTAINER ID   IMAGE              COMMAND                 CREATED          STATUS         PORTS                                      NAMES\r\n62a270bc27a7   image_pg_11_manu   \"docker-entrypoint.s\u2026\"  19 seconds ago   Up 18 seconds  0.0.0.0:5438-&gt;5432\/tcp, :::5438-&gt;5432\/tcp  postgresql11manu<\/pre>\n<p>Voir le log du container :<\/p>\n<pre># <strong>docker logs --tail 100 --details postgresql11manu<\/strong>\r\n...\r\nSuccess. You can now start the database server using:\r\n\r\npg_ctl -D \/var\/lib\/postgresql\/11 -l logfile start\r\n\r\nwaiting for server to start....2021-09-22 12:36:06.779 UTC [45] LOG: listening on Unix socket \"\/var\/run\/postgresql\/.s.PGSQL.5432\"\r\n2021-09-22 12:36:06.794 UTC [46] LOG: database system was shut down at 2021-09-22 12:36:06 UTC\r\n2021-09-22 12:36:06.798 UTC [45] LOG: database system is ready to accept connections\r\n2021-09-22 12:36:06.801 UTC [52] FATAL: database \"manudb\" does not exist\r\n2021-09-22 12:36:06.803 UTC [45] LOG: background worker \"pg_cron launcher\" (PID 52) exited with exit code 1\r\ndone\r\nserver started\r\n\r\nPostgreSQL init process complete; ready for start up.\r\n\r\n2021-09-22 12:36:07.456 UTC [1] LOG: listening on IPv4 address \"0.0.0.0\", port 5432\r\n2021-09-22 12:36:07.456 UTC [1] LOG: listening on IPv6 address \"::\", port 5432\r\n2021-09-22 12:36:07.459 UTC [1] LOG: listening on Unix socket \"\/var\/run\/postgresql\/.s.PGSQL.5432\"\r\n2021-09-22 12:36:07.473 UTC [92] LOG: database system was shut down at 2021-09-22 12:36:07 UTC\r\n2021-09-22 12:36:07.477 UTC [1] LOG: database system is ready to accept connections\r\n2021-09-22 12:36:07.486 UTC [98] LOG: pg_cron scheduler started<\/pre>\n<pre><\/pre>\n<p>L&#8217;instance est d\u00e9marr\u00e9e sur le port 5432 dans le container, mais bien accessible via le port 5438 depuis notre serveur local, comme nous le voyons sur la commande &#8220;<strong>docker container ls<\/strong>&#8220;.<br \/>\nA premi\u00e8re vue, nous voyons que PostgreSQL a du red\u00e9marrer car il ne trouvait pas la base &#8220;manudb&#8221;, celle ci a \u00e9t\u00e9 cr\u00e9\u00e9 par la suite.<\/p>\n<p>Test de connexion avec psql :<\/p>\n<p>&nbsp;<\/p>\n<pre>[postgres]$ <strong>psql -p 5438 -h localhost<\/strong>\r\nPassword for user postgres:\r\npsql (13.0, server 11.13 (Debian 11.13-1.pgdg90+1))\r\nType \"help\" for help.\r\n\r\npostgres=# \\l+\r\n\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List of databases\r\n \u00a0 Name\u00a0\u00a0\u00a0 |\u00a0 Owner\u00a0\u00a0 | Encoding |\u00a0 Collate\u00a0\u00a0 |\u00a0\u00a0 Ctype\u00a0\u00a0\u00a0 |\u00a0\u00a0 Access privileges\u00a0\u00a0 |\u00a0 Size\u00a0\u00a0 | Tablespace |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Description\r\n-----------+----------+----------+------------+------------+-----------------------+---------+------------+--------------------------------------------\r\n manudb \u00a0\u00a0 | manu\u00a0\u00a0\u00a0\u00a0 | UTF8\u00a0\u00a0\u00a0\u00a0 | en_US.utf8 | en_US.utf8 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 7529 kB | pg_default |\r\n postgres\u00a0 | postgres | UTF8\u00a0\u00a0\u00a0 \u00a0| en_US.utf8 | en_US.utf8 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 7669 kB | pg_default | default administrative connection database\r\n template0 | postgres | UTF8\u00a0\u00a0\u00a0\u00a0 | en_US.utf8 | en_US.utf8 | =c\/postgres\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +| 7529 kB | pg_default | unmodifiable empty database\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | postgres=CTc\/postgres |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n template1 | postgres | UTF8\u00a0\u00a0\u00a0\u00a0 | en_US.utf8 | en_US.utf8 | =c\/postgres\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 +| 7529 kB | pg_default | default template for new databases\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | postgres=CTc\/postgres |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n\r\n(4 rows)\r\n\r\npostgres=# \\du+\r\n\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 List of roles\r\n Role name |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Attributes\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Member of | Description\r\n-----------+------------------------------------------------------------+-----------+-------------\r\n manu\u00a0\u00a0\u00a0\u00a0\u00a0 | Create DB\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | {}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n\u00a0postgres\u00a0 | Superuser, Create role, Create DB, Replication, Bypass RLS | {}\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\r\n\r\n\r\npostgres=# select version();\r\n\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 version\r\n------------------------------------------------------------------------------------------------------------------------------------\r\n\u00a0PostgreSQL 11.13 (Debian 11.13-1.pgdg90+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516, 64-bit\r\n\r\n(1 row)<\/pre>\n<p>&nbsp;<\/p>\n<p>L&#8217;extension &#8220;<strong>pg_cron<\/strong>&#8221; a bien \u00e9t\u00e9 inscrite dans les librairies pr\u00e9charg\u00e9es avec un fonctionnement sur notre base &#8220;<strong>manudb<\/strong>&#8221; pass\u00e9e en param\u00e8tre \u00e0 l&#8217;appel du &#8220;<strong>docker run<\/strong>&#8221; :<\/p>\n<pre><strong># docker exec -it postgresql11manu psql -U postgres -c \"select name, setting from pg_settings where name like '%shared%'\"<\/strong>\r\nname                        | setting\r\n----------------------------+---------\r\ndynamic_shared_memory_type  | posix\r\nshared_buffers              | 16384\r\nshared_preload_libraries    | pg_cron\r\n\r\n\r\n<strong># docker exec -it postgresql11manu psql -U postgres -c \"select name, setting from pg_settings where name like '%cron%'\"<\/strong>\r\nname | setting\r\n-----------------------------+-----------\r\ncron.database_name           | manudb\r\ncron.host                    | localhost\r\ncron.log_run                 | on\r\ncron.log_statement           | on\r\ncron.max_running_jobs        | 32\r\ncron.use_background_workers  | off<\/pre>\n<pre><strong># docker exec -it postgresql11manu psql -U postgres -d manudb -c \"select * from pg_extension\"<\/strong>\r\nextname  | extowner | extnamespace | extrelocatable | extversion | extconfig                 | extcondition\r\n---------+----------+--------------+----------------+------------+---------------------------+---------------\r\nplpgsql  | 10       | 11           | f              | 1.0        |                           |\r\npg_cron  | 10       | 2200         | f              | 1.3        | {16390,16388,16411,16409} | {\"\",\"\",\"\",\"\"}<\/pre>\n<p>&nbsp;<\/p>\n<p>Notre instance a \u00e9t\u00e9 cr\u00e9\u00e9e avec succ\u00e8s. Elle est accessible depuis le port 5438 de notre machine, et notre r\u00f4le &#8220;<strong>manu<\/strong>&#8221; est cr\u00e9\u00e9 avec sa base &#8220;<strong>manudb<\/strong>&#8220;.<br \/>\nSur cette base, l&#8217;extension &#8220;pg_cron&#8221; est bien active.<br \/>\nCette instance est une version 11.13.<\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #3366ff;\">G\u00e9rer son container<\/span><\/h4>\n<p>Il est possible d&#8217;acc\u00e9der directement \u00e0 notre container et de lancer un &#8220;bash&#8221; dessus, accessible depuis le compte root de notre machine locale.<\/p>\n<pre># <strong>docker exec -it postgresql11manu bash<\/strong>\r\nroot@62a270bc27a7:\/# ls -l\r\n\r\n<\/pre>\n<p>A partir de la, nous pourrons acc\u00e9der \u00e0 notre instance PostgreSQL, accessible depuis le port par d\u00e9faut, 5432.<\/p>\n<pre>postgres@62a270bc27a7:~$ psql\r\npsql (11.13 (Debian 11.13-1.pgdg90+1))\r\nType \"help\" for help.\r\n\r\npostgres=# \\conninfo\r\nYou are connected to database \"postgres\" as user \"postgres\" via socket in \"\/var\/run\/postgresql\" at port \"5432\".<\/pre>\n<p>Attention, nous sommes sur un container, donc une image Linux &#8220;light&#8221;. De nombreuses commandes ne sont pas accessibles sur le bash courant.<\/p>\n<p>Il sera possible de v\u00e9rifier la configuration compl\u00e8te du container, avec l&#8217;option &#8220;inspect&#8221;. Le retour nous est donn\u00e9e via un affichage JSON<\/p>\n<pre># <strong>docker container ls<\/strong>\r\nCONTAINER ID\u00a0\u00a0 IMAGE\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 COMMAND\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CREATED\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 STATUS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 PORTS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 NAMES\r\n62a270bc27a7\u00a0\u00a0 image_pg_11_manu\u00a0\u00a0 \"docker-entrypoint.s\u2026\"\u00a0\u00a0 51 minutes ago\u00a0\u00a0 Up 51 minutes\u00a0\u00a0 0.0.0.0:5438-&gt;5432\/tcp, :::5438-&gt;5432\/tcp\u00a0\u00a0 postgresql11manu<\/pre>\n<pre># <strong>docker container inspect postgresql11manu<\/strong>\r\n[\r\n \u00a0\u00a0 {\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Id\": \"62a270bc27a71585208fd2223ee92fc6a4e49eceb11ea4cd6ad2cf383bd3103d\",\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Created\": \"2021-09-17T15:24:39.528442352Z\",\r\n \u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\"Path\": \"docker-entrypoint.sh\",\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Args\": [\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"postgres\"\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ],\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"State\": {\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Status\": \"running\",\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Running\": true,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Paused\": false,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Restarting\": false,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"OOMKilled\": false,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Dead\": false,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Pid\": 30809,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"ExitCode\": 0,\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"Error\": \"\",\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"StartedAt\": \"2021-09-17T15:24:40.13504382Z\",\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"FinishedAt\": \"0001-01-01T00:00:00Z\"\r\n \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }, .........<\/pre>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #3366ff;\">La persistance des donn\u00e9es<\/span><\/h4>\n<p>Il est possible de rendre persistent les fichiers de son instance sur son syst\u00e8me local. Pour cela, nous utiliserons l&#8217;option <strong>-v<\/strong> ou &#8212;<strong>volume<\/strong> afin de faire pointer les fichiers bases de donn\u00e9es sur un FS de notre machine. Ceci nous permettra de conserver une copie en locale des fichiers, m\u00eame une fois notre container supprim\u00e9 !<\/p>\n<p>Cr\u00e9er le FS localement :<\/p>\n<pre><strong># mkdir \/data\/postgres\/11.13<\/strong><\/pre>\n<p>La suite consistera \u00e0 cr\u00e9er un nouveau container, \u00e0 partir de notre image construite auparavant, qui porte le nom &#8220;image_pg_11_manu&#8221;.<\/p>\n<pre><strong># docker run --name pg11manu_local -itd --restart always --publish 5439:5432 -e \"POSTGRES_PASSWORD=test2021\" -e \"DB_MANU=<span style=\"color: #993366;\">manudb2<\/span>\" -e \"USER_MANU_PASS=<span style=\"color: #993366;\">test2021<\/span>\" <span style=\"color: #993366;\">-v \"\/data\/postgres\/11.13:\/var\/lib\/postgresql\/11\"<\/span> image_pg_11_manu<\/strong>\r\n51a6a4c8e9e3cf7b80fb1870415446ef9f38ac2847df0791e8e9332ad84f95f6<\/pre>\n<p>Nous cr\u00e9ons donc un nouveau container, avec une base nomm\u00e9e &#8220;<strong>manudb2<\/strong>&#8220;, avec des fichiers persist\u00e9s vers le nouveau dossier &#8220;<strong>\/data\/postgres\/11.13<\/strong>&#8221; sur notre machine locale.<\/p>\n<p>Si l&#8217;on v\u00e9rifie les bases en se connectant sur le container :<\/p>\n<pre><strong># docker exec -it pg11manu_local psql -U postgres -c \"\\l\"<\/strong>\r\nList of databases\r\nName       | Owner    | Encoding | Collate    | Ctype | Access privileges\r\n-----------+----------+----------+------------+------------+-----------------------\r\nmanudb2    | manu     | UTF8     | en_US.utf8 | en_US.utf8 |\r\npostgres   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |\r\ntemplate0  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c\/postgres +\r\n           |          |          |            |            | postgres=CTc\/postgres\r\ntemplate1  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c\/postgres +\r\n           |          |          |            |            | postgres=CTc\/postgres<\/pre>\n<p>&nbsp;<\/p>\n<p>Et sur le FS local :<\/p>\n<pre><strong># ls -lrt \/data\/postgres\/11.13\/<\/strong>\r\ntotal 120\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_dynshmem\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_commit_ts\r\n-rw-------. 1 systemd-coredump input 3 Sep 21 15:14 PG_VERSION\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_twophase\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_tblspc\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_snapshots\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_serial\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_replslot\r\ndrwx------. 4 systemd-coredump input 4096 Sep 21 15:14 pg_multixact\r\n-rw-------. 1 systemd-coredump input 88 Sep 21 15:14 postgresql.auto.conf\r\n-rw-------. 1 systemd-coredump input 1636 Sep 21 15:14 pg_ident.conf\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_xact\r\ndrwx------. 3 systemd-coredump input 4096 Sep 21 15:14 pg_wal\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:14 pg_subtrans\r\n-rw-------. 1 systemd-coredump input 4535 Sep 21 15:14 pg_hba.conf\r\ndrwx------. 6 systemd-coredump input 4096 Sep 21 15:14 base\r\n-rw-------. 1 systemd-coredump input 24084 Sep 21 15:16 postgresql.conf\r\ndrwx------. 4 systemd-coredump input 4096 Sep 21 15:17 pg_logical\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:18 pg_notify\r\n-rw-------. 1 systemd-coredump input 36 Sep 21 15:18 postmaster.opts\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:18 global\r\n-rw-------. 1 systemd-coredump input 92 Sep 21 15:18 postmaster.pid\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:18 pg_stat_tmp\r\ndrwx------. 2 systemd-coredump input 4096 Sep 21 15:18 pg_stat<\/pre>\n<p>Nos fichiers sont la !<\/p>\n<p>Passons, par exemple, le &#8220;shared_buffer&#8221; de 128M par d\u00e9faut \u00e0 256M dans le fichier &#8220;postgresql.conf&#8221;.<\/p>\n<pre><strong># vi \/data\/postgres\/11.13\/\/postgresql.conf<\/strong>\r\n...\r\nshared_buffers = 256MB<\/pre>\n<pre><strong>\r\n# docker container stop pg11manu_local \r\n# docker container start pg11manu_local \r\n\r\n# docker exec -it pg11manu_local psql -U postgres -c \"show shared_buffers\"<\/strong>\r\nshared_buffers\r\n----------------\r\n256MB<\/pre>\n<p>&nbsp;<\/p>\n<p>Maintenant, supprimons compl\u00e8tement le container.<\/p>\n<pre># <strong>docker stop pg11manu_local<\/strong>\r\npg11manu_local\r\n# <strong>docker rm pg11manu_local<\/strong>\r\npg11manu_local<\/pre>\n<p>Nous remarquons que les fichiers sont toujours la dans le FS<\/p>\n<pre># ls -lrt \/data\/postgres\/11.13\/ | wc -l\r\n25<\/pre>\n<p>Et s&#8217;il l&#8217;on recr\u00e9e un container vers ce m\u00eame volume !<\/p>\n<pre><strong># docker run --name pg11manu_local_2 -itd --restart always --publish 5439:5432 -e \"POSTGRES_PASSWORD=test2021\" -e \"DB_MANU=manudb2\" -e \"USER_MANU_PASS=test2021\" -v \"\/data\/postgres\/11.13:\/var\/lib\/postgresql\/11\" image_pg_11_manu<\/strong>\r\nc4a7705e4d38709ae33e16a7f9791dc727bbca23dea32e8c11337575e255b40c<\/pre>\n<p>&nbsp;<\/p>\n<pre><strong># docker exec -it pg11manu_local_2 psql -U postgres -c \"\\l\"<\/strong>\r\nList of databases\r\nName       | Owner    | Encoding | Collate    | Ctype | Access privileges\r\n-----------+----------+----------+------------+------------+-----------------------\r\nmanudb2    | manu     | UTF8     | en_US.utf8 | en_US.utf8 |\r\npostgres   | postgres | UTF8     | en_US.utf8 | en_US.utf8 |\r\ntemplate0  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c\/postgres +\r\n           |          |          |            |            | postgres=CTc\/postgres\r\ntemplate1  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c\/postgres +\r\n           |          |          |            |            | postgres=CTc\/postgres<\/pre>\n<p>&nbsp;<\/p>\n<pre><strong># docker exec -it pg11manu_local_2 psql -U postgres -c \"show shared_buffers\"<\/strong>\r\nshared_buffers\r\n----------------\r\n256MB\r\n(1 row)<\/pre>\n<p>&nbsp;<\/p>\n<p>la valeur de notre &#8220;shared_buffer&#8221; a \u00e9t\u00e9 conserv\u00e9e car c&#8217;est celle qui est configur\u00e9e sur le &#8220;<strong>postgresql.conf<\/strong>&#8221; sur le FS local.<\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #3366ff;\"><strong>Sauvegarder un container<\/strong><\/span><\/h4>\n<p>Pour effectuer la sauvegarde de notre container PostgreSQL, 2 solutions.<\/p>\n<p>&#8211; via un export du container complet dans un fichier &#8220;tar&#8221;<\/p>\n<pre><strong>#<\/strong><strong style=\"font-family: Consolas, Monaco, monospace;\"> docker container export pg11manu_local_2 -o container_manu_2.tar<\/strong>\r\n<strong style=\"font-family: Consolas, Monaco, monospace;\"># ls -l container_manu_2.tar<\/strong>\r\n-rw-------. 1 root root 282522624 Sep 21 15:44 container_manu_2.tar<\/pre>\n<p>Attention, dans cette m\u00e9thode, toute l&#8217;arborescence du montage &#8220;overlay&#8221; sera prise en charge dans l&#8217;archive. un &#8220;tar tvf&#8221; sur le fichier permettra de voir le contenu.<\/p>\n<p>&#8211; via la cr\u00e9ation d&#8217;un &#8220;snapshot&#8221; pour faire une image de notre container. L&#8217;option -p permet de faire une image dite consistente, le container est mis en &#8220;pause&#8221; durant le backup.<\/p>\n<pre><strong># docker container commit -a \"Emmanuel RAMI\" -p pg11manu_local_2 backup_pg11manu_local_2<\/strong>\r\nsha256:310b8475239840be9de470e574a94e74122b481bdc23abc300d2f2451388c649\r\n\r\n<strong># docker image ls backup_pg11manu_local_2<\/strong>\r\nREPOSITORY               TAG      IMAGE ID      CREATED        SIZE\r\nbackup_pg11manu_local_2  latest   310b84752398  2 minutes ago  283MB<\/pre>\n<p>Par la suite, nous pouvons envoyer vers un fichier &#8220;tar&#8221; le contenu de cette image<\/p>\n<pre><strong># docker save -o \/data\/postgres\/backup\/backup_pg11manu_local_2 backup_pg11manu_local_2<\/strong>\r\n\r\n<strong># ls -l \/data\/postgres\/backup\/backup_pg11manu_local_2<\/strong>\r\n-rw-------. 1 root root 290162176 Sep 21 15:53 \/data\/postgres\/backup\/backup_pg11manu_local_2<\/pre>\n<p>&nbsp;<\/p>\n<p>A noter que les fichiers d&#8217;export du container et de l&#8217;image seront sensiblement aussi volumineux.<br \/>\nIl sera cependant possible d&#8217;externaliser son image via un &#8220;<strong>docker push<\/strong>&#8221; vers un compte sur <a href=\"https:\/\/hub.docker.com\/\">DockerHub<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #3366ff;\">Supprimer le container et son image<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p>Attention, avant de supprimer l&#8217;image, il faut tout d&#8217;abord supprimer les containers qui y sont rattach\u00e9s. Sinon :<\/p>\n<pre><strong># docker image ls<\/strong>\r\nREPOSITORY                TAG           IMAGE ID      CREATED          SIZE\r\nbackup_pg11manu_local_2   latest        310b84752398  16 hours ago     283MB\r\nimage_pg_11_manu          latest        ea64f1b1c6ff  4 days ago       283MB\r\npostgres                  latest        346c7820a8fb  2 weeks ago      315MB\r\ndebian                    stretch-slim  27a36d9cbe0f  2 weeks ago      55.3MB<\/pre>\n<pre><strong># docker image rm image_pg_11_manu<\/strong>\r\nError response from daemon: conflict: unable to remove repository reference \"image_pg_11_manu\" (must force) - container c4a7705e4d38 is using its referenced image ea64f1b1c6ff<\/pre>\n<p>&nbsp;<\/p>\n<p>Voyons le container portant l&#8217;ID c4a7705e4d38<\/p>\n<pre><strong># docker container ls<\/strong>\r\nCONTAINER ID    IMAGE              COMMAND                  CREATED         STATUS            PORTS                                     NAMES\r\nc4a7705e4d38    image_pg_11_manu   \"docker-entrypoint.s\u2026\"   16 hours ago    Up About a minute 0.0.0.0:5439-&gt;5432\/tcp, :::5439-&gt;5432\/tcp pg11manu_local_2\r\n1fcc85219a3e    postgres           \"docker-entrypoint.s\u2026\"   40 hours ago    Up About a minute 0.0.0.0:5440-&gt;5432\/tcp, :::5440-&gt;5432\/tcp postgresql13\r\n62a270bc27a7    image_pg_11_manu   \"docker-entrypoint.s\u2026\"   4 days ago      Up About a minute 0.0.0.0:5438-&gt;5432\/tcp, :::5438-&gt;5432\/tcp postgresql11manu<\/pre>\n<p>&nbsp;<\/p>\n<p>C&#8217;est le second container portant les fichiers PostgreSQL sur un FS en local. Nous allons donc arr\u00eater et supprimer celui ci<\/p>\n<pre><strong># docker container stop pg11manu_local_2<\/strong>\r\npg11manu_local_2\r\n\r\n<strong># docker container rm pg11manu_local_2<\/strong>\r\npg11manu_local_2<\/pre>\n<p>Puis<\/p>\n<pre><strong># docker image rm image_pg_11_manu<\/strong>\r\nUntagged: image_pg_11_manu:latest<\/pre>\n<p>et<\/p>\n<pre><strong># docker image ls<\/strong>\r\nREPOSITORY                TAG           IMAGE ID      CREATED        SIZE\r\nbackup_pg11manu_local_2   latest        310b84752398  16 hours ago   283MB\r\npostgres                  latest        346c7820a8fb  2 weeks ago    315MB\r\ndebian                    stretch-slim  27a36d9cbe0f  2 weeks ago    55.3MB<\/pre>\n<p>&nbsp;<\/p>\n<p>N&#8217;h\u00e9sitez pas si vous avez des commentaires \ud83d\ude42<\/p>\n<p>Merci \u00e0 vous.<\/p>\n<p>Emmanuel RAMI<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8797&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8797&#038;title=Containeriser%20PostgreSQL%20avec%20Docker%20%21\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Containeriser%20PostgreSQL%20avec%20Docker%20%21&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F8797\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Bonjour, Depuis quelques ann\u00e9es maintenant, nous avons vu arriver dans le milieu de l&#8217;informatique, le ph\u00e9nom\u00e8ne de &#8220;containerisation&#8221; ! C&#8217;est quoi au juste ! Et qu&#8217;est ce qui change par rapport \u00e0 la virtualisation ? On va dire que c&#8217;est&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":32,"featured_media":10775,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[383,266],"tags":[384],"class_list":["post-8797","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-container","category-postgresql","tag-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Containeriser PostgreSQL avec Docker ! - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Containeriser PostgreSQL avec Docker ! - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Bonjour, Depuis quelques ann\u00e9es maintenant, nous avons vu arriver dans le milieu de l&#8217;informatique, le ph\u00e9nom\u00e8ne de &#8220;containerisation&#8221; ! C&#8217;est quoi au juste ! Et qu&#8217;est ce qui change par rapport \u00e0 la virtualisation ? On va dire que c&#8217;est&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-23T07:40:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T08:52:02+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/conteneurs.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"605\" \/>\n\t<meta property=\"og:image:height\" content=\"403\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Emmanuel RAMI\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emmanuel RAMI\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\"},\"author\":{\"name\":\"Emmanuel RAMI\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae\"},\"headline\":\"Containeriser PostgreSQL avec Docker !\",\"datePublished\":\"2021-09-23T07:40:40+00:00\",\"dateModified\":\"2026-03-11T08:52:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\"},\"wordCount\":2974,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"Docker\"],\"articleSection\":[\"Container\",\"PostgreSQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\",\"name\":\"Containeriser PostgreSQL avec Docker ! - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2021-09-23T07:40:40+00:00\",\"dateModified\":\"2026-03-11T08:52:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Containeriser PostgreSQL avec Docker !\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae\",\"name\":\"Emmanuel RAMI\",\"sameAs\":[\"https:\/\/blog.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/erami\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Containeriser PostgreSQL avec Docker ! - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/","og_locale":"fr_FR","og_type":"article","og_title":"Containeriser PostgreSQL avec Docker ! - Capdata TECH BLOG","og_description":"Bonjour, Depuis quelques ann\u00e9es maintenant, nous avons vu arriver dans le milieu de l&#8217;informatique, le ph\u00e9nom\u00e8ne de &#8220;containerisation&#8221; ! C&#8217;est quoi au juste ! Et qu&#8217;est ce qui change par rapport \u00e0 la virtualisation ? On va dire que c&#8217;est&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2021-09-23T07:40:40+00:00","article_modified_time":"2026-03-11T08:52:02+00:00","og_image":[{"width":605,"height":403,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2021\/09\/conteneurs.jpg","type":"image\/jpeg"}],"author":"Emmanuel RAMI","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Emmanuel RAMI","Dur\u00e9e de lecture estim\u00e9e":"25 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/"},"author":{"name":"Emmanuel RAMI","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae"},"headline":"Containeriser PostgreSQL avec Docker !","datePublished":"2021-09-23T07:40:40+00:00","dateModified":"2026-03-11T08:52:02+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/"},"wordCount":2974,"commentCount":5,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["Docker"],"articleSection":["Container","PostgreSQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/","url":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/","name":"Containeriser PostgreSQL avec Docker ! - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2021-09-23T07:40:40+00:00","dateModified":"2026-03-11T08:52:02+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/containeriser-une-base-de-donnees-postgresql-avec-docker\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Containeriser PostgreSQL avec Docker !"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae","name":"Emmanuel RAMI","sameAs":["https:\/\/blog.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/erami\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8797","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=8797"}],"version-history":[{"count":30,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8797\/revisions"}],"predecessor-version":[{"id":10776,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/8797\/revisions\/10776"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/10775"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=8797"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=8797"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=8797"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}