{"action":"created","comment":{"url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments/33421351","id":33421351,"diff_hunk":"@@ -0,0 +1,262 @@\n+---\n+date: \"2015-06-30\"\n+title: Les Dockerfiles\n+tags:\n+  - docker\n+authors:\n+  - Uhsac\n+header:\n+  credit: https://www.flickr.com/photos/tristantaussac/15145365916/\n+---\n+\n+Dans [l'article précédent](/posts/docker/introduction-a-docker), je vous ai\n+introduit le fonctionnement de base de Docker. Mais cela vous limitais à\n+l'usage des images que vous pouviez trouver sur le [Docker\n+Hub](https://registry.hub.docker.com/), afin de vraiment pouvoir utiliser\n+Docker au maximum il serait appréciable de pouvoir créer des images adaptées à\n+nos projets et c'est là l'utilité des Dockerfiles.\n+\n+# Les Dockerfiles\n+\n+Les Dockerfiles sont des fichiers qui permettent de construire une image Docker\n+adapté à nos besoins étape par étape. Rentrons dans le vif du sujet en créant\n+une image permettant de lancer un projet Javascript full-stack.\n+\n+Pour commencer, créer un nouveau fichier `Dockerfile` à la racine de votre\n+projet.\n+\n+La première chose à faire dans un Dockerfile est de définir de quelle image\n+vous hériter, pour cet exemple, je vous propose d'utiliser une image de Debian\n+comme base (ce qui est une bonne pratique, car cette image\n+est plutôt légère en comparaison de celle d'Ubuntu par exemple).\n+\n+```\n+FROM debian:jessie\n+```\n+\n+`FROM` permet de définir notre image de base, vous pouvez l'utiliser uniquement\n+une fois dans un Dockerfile.\n+\n+Comme nous voulons créer une image pour une application Javascript full-stack,\n+nous devons commencer par installer nodejs. Pour ce faire, on va télécharger\n+l'archive nodejs directement depuis le site officiel à l'aide de curl que nous\n+allons aussi devoir installer.\n+\n+```\n+RUN apt-get update \\\n+&& apt-get install -y curl git \\\n+&& rm -rf /var/lib/apt/lists/*\n+\n+RUN curl -LO \"https://nodejs.org/dist/v0.12.5/node-v0.12.5-linux-x64.tar.gz\" \\\n+&& tar -xzf node-v0.12.5-linux-x64.tar.gz -C /usr/local --strip-components=1 \\\n+&& rm node-v0.12.5-linux-x64.tar.gz\n+\n+RUN npm install -g bower\n+```\n+\n+`RUN` permet d'exécuter une commande à l'interieur de votre image comme si vous\n+étiez devant un shell unix \n+\n+La première commande nous permet d'installer curl et de nettoyer ensuite le\n+gestionnaire de paquet afin que notre image soit un peu plus légère.\n+\n+Avec la deuxième commande, nous téléchargeons le binaire de nodejs que nous\n+installons ensuite à ça place, et on n'oublie pas de supprimer l'archive\n+ensuite.\n+\n+Et la dernière installe simplement bower que nous utiliserons pour notre\n+application.\n+\n+Vous pouvez vous demander pourquoi j'exécute plusieurs commandes sur une même\n+instruction `RUN` ? Et bien cela permet simplement de limiter le nombre\n+d'instruction dans votre Dockerfile ce qui rendra votre image finale plus\n+légère.\n+\n+Maintenant, nous allons ajouter les sources de notre projet dans l'image et\n+télécharger nos dépendances.\n+\n+```\n+ADD *.json /app/\n+\n+WORKDIR /app\n+\n+RUN npm install \\\n+&& bower install --allow-root\n+\n+ADD . /app/\n+```\n+\n+`ADD` permet d'ajouter des fichiers locaux ou distants à l'intérieur de votre\n+image, il est le plus souvent utilisé pour importer les sources de votre projet\n+ou des fichiers de configuration.\n+\n+`WORKDIR` permet de changer le répertoire courant de votre image, toutes les\n+commandes qui suivront seront exécuter à partir de ce répertoire.\n+\n+Avec la dernière instruction, nous ajoutons les sources de notre projet à\n+l'intérieur de l'image, mais vous allez vous demander pourquoi nous ne l'avons\n+pas fait en même temps que l'ajout des fichiers de dépendances. Et bien cela\n+nous permet d'économiser beaucoup de temps, car au moment de la création de\n+l'image, Docker exécute les instructions du Dockerfile une par une et puis stock\n+leur résultat en cache, et grâce à ça lorsque nous reconstruisons une image les\n+instructions qui n'implique pas de changement entre l'ancienne et la nouvelle\n+image son réexécuté instantanément grâce au cache. Dans notre cas, ce qui\n+impliquera le plus de changement entre deux images sera sans doute la\n+modification des sources, nous serons donc bien contents de ne pas avoir à\n+retélécharger les dépendances du projet à chaque fois.\n+\n+Maintenant, nous allons indiquer quel port et dossier, nous souhaitons partager\n+avec l'extérieur du conteneur.\n+\n+```\n+EXPOSE 3000\n+\n+VOLUME /app/log\n+```\n+`EXPOSE` et `VOLUME` permettent respectivement d'indiquer quel port et quel\n+dossier nous souhaitons partager.\n+\n+Et pour finir, nous pouvons indiquer quelle instruction doit s'exécuter au\n+lancement de votre conteneur grâce à l'instruction `CMD`.\n+\n+```\n+CMD node server.js \n+```\n+\n+Voici un résumé de notre Dockerfile :\n+\n+```\n+# Image de base\n+FROM debian:jessie\n+\n+# Installation de curl avec apt-get\n+RUN apt-get update \\\n+&& apt-get install -y curl git \\\n+&& rm -rf /var/lib/apt/lists/*\n+\n+# Installation de nodejs à partir du site officiel\n+RUN curl -LO \"https://nodejs.org/dist/v0.12.5/node-v0.12.5-linux-x64.tar.gz\" \\\n+&& tar -xzf node-v0.12.5-linux-x64.tar.gz -C /usr/local --strip-components=1 \\\n+&& rm node-v0.12.5-linux-x64.tar.gz\n+\n+# Installation de bower avec npm\n+RUN npm install -g bower\n+\n+# Ajout des fichiers de dépendances package.json et bower.json\n+ADD *.json /app/\n+\n+# Changement du repertoire courant\n+WORKDIR /app\n+\n+# Installation des dépendances\n+RUN npm install \\\n+&& bower install --allow-root\n+\n+# Ajout des sources\n+ADD . /app/\n+\n+# On expose le port 3000\n+EXPOSE 3000\n+\n+# On partage un dossier de log\n+VOLUME /app/log\n+\n+# On lance le serveur quand on démarre le conteneur\n+CMD node server.js\n+```\n+\n+Avant de transformer ce Dockerfile en une image, vous devez créer un fichier de\n+plus, le `.dockerignore`, ce fichier permet comme un `.gitignore` de ne pas\n+inclure certain fichier dans votre image docker, et c'est très important afin\n+d'éviter d'inclure les dépendances de votre projet dans votre image\n+(`node_modules` et `bower_components` dans notre cas) qui sont propres à votre\n+système, mais pas au système du conteneur. Voici à quoi votre `.dockerignore`\n+doit ressembler :\n+\n+```\n+node_modules\n+bower_components\n+.git\n+```\n+\n+Pour transformer ce Dockerfile en une image docker, vous devez utiliser cette\n+commande :\n+\n+```console\n+$ docker build -t fullstack-js .\n+Sending build context to Docker daemon 4.381 MB\n+Sending build context to Docker daemon\n+Step 0 : FROM debian:jessie\n+ ---> bf84c1d84a8f\n+Step 1 : RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*\n+ ---> Running in 93258459a279\n+...\n+ ---> 4fffcf3749a2\n+Removing intermediate container 93258459a279\n+Step 2 : RUN curl -LO \"https://nodejs.org/dist/v0.12.5/node-v0.12.5-linux-x64.tar.gz\" && tar -xzf node-v0.12.5-linux-x64.tar.gz -C /usr/local --strip-components=1 && rm node-v0.12.5-linux-x64.tar.gz\n+ ---> Running in a3a17d584bae\n+...\n+ ---> 4eaa62ace8de\n+Removing intermediate container a3a17d584bae\n+Step 3 : RUN npm install -g bower\n+ ---> Running in ab73acf69906\n+...\n+ ---> 798af72f7ae2\n+Removing intermediate container ab73acf69906\n+Step 4 : ADD *.json /app/\n+ ---> 1e8ffd7e10a8\n+Removing intermediate container 5db20e8b8ed2\n+Step 5 : WORKDIR /app\n+ ---> Running in 7b84b06642b1\n+ ---> 9c0e2287c34d\n+Removing intermediate container 7b84b06642b1\n+Step 6 : RUN npm install && bower install --allow-root\n+ ---> Running in 0523df6e9aac\n+...\n+ ---> 6d7327ebee30\n+Removing intermediate container 0523df6e9aac\n+Step 7 : ADD . /app\n+ ---> 13bdbe70c6fa\n+Removing intermediate container 3c83d82c1d53\n+Step 8 : EXPOSE 3000\n+ ---> Running in 51e252173b12\n+ ---> 6c62eb1197e2\n+Removing intermediate container 51e252173b12\n+Step 9 : VOLUME /app/log\n+ ---> Running in 4af0bb73307b\n+ ---> 15b6190de473\n+Removing intermediate container 4af0bb73307b\n+Step 10 : CMD node server.js\n+ ---> Running in 9522c6b9bf95\n+ ---> aaf20fb25dac\n+Removing intermediate container 9522c6b9bf95\n+Successfully built aaf20fb25dac\n+```\n+\n+L'option `-t` permet de nommer votre image docker ce qui vous servira lorsque\n+vous voudrez lancer votre conteneur. Et le `.` est le repertoire ou ce trouve\n+le Dockerfile, dans notre cas le dossier courant.\n+\n+Maintenant, vous pouvez lancer votre conteneur de cette manière :\n+\n+```console\n+$ docker run -d -p 3000:3000 -v $(pwd)/log:/app/log fullstack-js\n+```\n+\n+Vous devriez comprendre cette commande, si ce n'est pas le cas, vous pouvez lire\n+mon [article précédent](/posts/docker/introduction-a-docker).\n+\n+---\n+\n+Dans cet article, vous avez pu voir comment créer votre propre Dockerfile,\n+maintenant vous pouvez créer des images docker parfaitement adapté à votre\n+projet, et même plus, en cherchant sur internet, vous pourrez trouver des images\n+docker pour tout et n'importe quoi, comme des images pour lancer chrome dans un\n+conteneur par exemple, si vous voulez en savoir plus je vous redirige vers le\n+blog de [Jessie\n+Frazelle](https://blog.jessfraz.com/post/docker-containers-on-the-desktop/).\n+\n+Dans le prochain article, je vous parlerais de docker-compose, un outil qui\n+permet de lancer des applications multi-conteneurs facilement. Avec cet outil,","path":"content/posts/docker/les-dockerfiles/index.md","position":260,"original_position":260,"commit_id":"ddb42c6d4af11649919b8194801a35402bc68dec","original_commit_id":"ddb42c6d4af11649919b8194801a35402bc68dec","user":{"login":"bloodyowl","id":1688645,"avatar_url":"https://avatars.githubusercontent.com/u/1688645?v=3","gravatar_id":"","url":"https://api.github.com/users/bloodyowl","html_url":"https://github.com/bloodyowl","followers_url":"https://api.github.com/users/bloodyowl/followers","following_url":"https://api.github.com/users/bloodyowl/following{/other_user}","gists_url":"https://api.github.com/users/bloodyowl/gists{/gist_id}","starred_url":"https://api.github.com/users/bloodyowl/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bloodyowl/subscriptions","organizations_url":"https://api.github.com/users/bloodyowl/orgs","repos_url":"https://api.github.com/users/bloodyowl/repos","events_url":"https://api.github.com/users/bloodyowl/events{/privacy}","received_events_url":"https://api.github.com/users/bloodyowl/received_events","type":"User","site_admin":false},"body":"la dernière phrase me paraît superflue.","created_at":"2015-06-28T10:25:36Z","updated_at":"2015-06-28T10:25:36Z","html_url":"https://github.com/putaindecode/putaindecode.fr/pull/467#discussion_r33421351","pull_request_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467","_links":{"self":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments/33421351"},"html":{"href":"https://github.com/putaindecode/putaindecode.fr/pull/467#discussion_r33421351"},"pull_request":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467"}}},"pull_request":{"url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467","id":38723058,"html_url":"https://github.com/putaindecode/putaindecode.fr/pull/467","diff_url":"https://github.com/putaindecode/putaindecode.fr/pull/467.diff","patch_url":"https://github.com/putaindecode/putaindecode.fr/pull/467.patch","issue_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/467","number":467,"state":"open","locked":false,"title":"Post: Les Dockerfiles","user":{"login":"Uhsac","id":6172122,"avatar_url":"https://avatars.githubusercontent.com/u/6172122?v=3","gravatar_id":"","url":"https://api.github.com/users/Uhsac","html_url":"https://github.com/Uhsac","followers_url":"https://api.github.com/users/Uhsac/followers","following_url":"https://api.github.com/users/Uhsac/following{/other_user}","gists_url":"https://api.github.com/users/Uhsac/gists{/gist_id}","starred_url":"https://api.github.com/users/Uhsac/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Uhsac/subscriptions","organizations_url":"https://api.github.com/users/Uhsac/orgs","repos_url":"https://api.github.com/users/Uhsac/repos","events_url":"https://api.github.com/users/Uhsac/events{/privacy}","received_events_url":"https://api.github.com/users/Uhsac/received_events","type":"User","site_admin":false},"body":"Poke @putaindecode/owners \r\n\r\nCoucou voila un deuxième article sur Docker","created_at":"2015-06-28T10:04:49Z","updated_at":"2015-06-28T10:25:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"284d5d5f46789e4061faf060b335a081e6228c25","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467/commits","review_comments_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467/comments","review_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments{/number}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/467/comments","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/statuses/ddb42c6d4af11649919b8194801a35402bc68dec","head":{"label":"Uhsac:post.les-dockerfiles","ref":"post.les-dockerfiles","sha":"ddb42c6d4af11649919b8194801a35402bc68dec","user":{"login":"Uhsac","id":6172122,"avatar_url":"https://avatars.githubusercontent.com/u/6172122?v=3","gravatar_id":"","url":"https://api.github.com/users/Uhsac","html_url":"https://github.com/Uhsac","followers_url":"https://api.github.com/users/Uhsac/followers","following_url":"https://api.github.com/users/Uhsac/following{/other_user}","gists_url":"https://api.github.com/users/Uhsac/gists{/gist_id}","starred_url":"https://api.github.com/users/Uhsac/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Uhsac/subscriptions","organizations_url":"https://api.github.com/users/Uhsac/orgs","repos_url":"https://api.github.com/users/Uhsac/repos","events_url":"https://api.github.com/users/Uhsac/events{/privacy}","received_events_url":"https://api.github.com/users/Uhsac/received_events","type":"User","site_admin":false},"repo":{"id":37283600,"name":"putaindecode.fr","full_name":"Uhsac/putaindecode.fr","owner":{"login":"Uhsac","id":6172122,"avatar_url":"https://avatars.githubusercontent.com/u/6172122?v=3","gravatar_id":"","url":"https://api.github.com/users/Uhsac","html_url":"https://github.com/Uhsac","followers_url":"https://api.github.com/users/Uhsac/followers","following_url":"https://api.github.com/users/Uhsac/following{/other_user}","gists_url":"https://api.github.com/users/Uhsac/gists{/gist_id}","starred_url":"https://api.github.com/users/Uhsac/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Uhsac/subscriptions","organizations_url":"https://api.github.com/users/Uhsac/orgs","repos_url":"https://api.github.com/users/Uhsac/repos","events_url":"https://api.github.com/users/Uhsac/events{/privacy}","received_events_url":"https://api.github.com/users/Uhsac/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Uhsac/putaindecode.fr","description":"Partager du code et des méthodes de travail de qualité, afin qu’on puisse tous s’améliorer ensemble.","fork":true,"url":"https://api.github.com/repos/Uhsac/putaindecode.fr","forks_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/forks","keys_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/teams","hooks_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/hooks","issue_events_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/issues/events{/number}","events_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/events","assignees_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/assignees{/user}","branches_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/branches{/branch}","tags_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/tags","blobs_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/git/refs{/sha}","trees_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/statuses/{sha}","languages_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/languages","stargazers_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/stargazers","contributors_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/contributors","subscribers_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/subscribers","subscription_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/subscription","commits_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/commits{/sha}","git_commits_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/git/commits{/sha}","comments_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/comments{/number}","issue_comment_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/issues/comments{/number}","contents_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/contents/{+path}","compare_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/merges","archive_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/downloads","issues_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/issues{/number}","pulls_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/pulls{/number}","milestones_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/milestones{/number}","notifications_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/labels{/name}","releases_url":"https://api.github.com/repos/Uhsac/putaindecode.fr/releases{/id}","created_at":"2015-06-11T20:11:53Z","updated_at":"2015-06-11T20:11:54Z","pushed_at":"2015-06-28T10:01:21Z","git_url":"git://github.com/Uhsac/putaindecode.fr.git","ssh_url":"git@github.com:Uhsac/putaindecode.fr.git","clone_url":"https://github.com/Uhsac/putaindecode.fr.git","svn_url":"https://github.com/Uhsac/putaindecode.fr","homepage":"http://putaindecode.fr","size":38147,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"putaindecode:master","ref":"master","sha":"76de301852a5e0b18f4e824f0f1984ee32134be2","user":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"repo":{"id":10319056,"name":"putaindecode.fr","full_name":"putaindecode/putaindecode.fr","owner":{"login":"putaindecode","id":4541781,"avatar_url":"https://avatars.githubusercontent.com/u/4541781?v=3","gravatar_id":"","url":"https://api.github.com/users/putaindecode","html_url":"https://github.com/putaindecode","followers_url":"https://api.github.com/users/putaindecode/followers","following_url":"https://api.github.com/users/putaindecode/following{/other_user}","gists_url":"https://api.github.com/users/putaindecode/gists{/gist_id}","starred_url":"https://api.github.com/users/putaindecode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/putaindecode/subscriptions","organizations_url":"https://api.github.com/users/putaindecode/orgs","repos_url":"https://api.github.com/users/putaindecode/repos","events_url":"https://api.github.com/users/putaindecode/events{/privacy}","received_events_url":"https://api.github.com/users/putaindecode/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/putaindecode/putaindecode.fr","description":"Partager du code et des méthodes de travail de qualité, afin qu’on puisse tous s’améliorer ensemble.","fork":false,"url":"https://api.github.com/repos/putaindecode/putaindecode.fr","forks_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/forks","keys_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/teams","hooks_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/hooks","issue_events_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/events{/number}","events_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/events","assignees_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/assignees{/user}","branches_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/branches{/branch}","tags_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/tags","blobs_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/refs{/sha}","trees_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/statuses/{sha}","languages_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/languages","stargazers_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/stargazers","contributors_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/contributors","subscribers_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/subscribers","subscription_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/subscription","commits_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/commits{/sha}","git_commits_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/git/commits{/sha}","comments_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/comments{/number}","issue_comment_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/comments{/number}","contents_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/contents/{+path}","compare_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/merges","archive_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/downloads","issues_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues{/number}","pulls_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls{/number}","milestones_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/milestones{/number}","notifications_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/labels{/name}","releases_url":"https://api.github.com/repos/putaindecode/putaindecode.fr/releases{/id}","created_at":"2013-05-27T17:08:41Z","updated_at":"2015-06-27T02:19:05Z","pushed_at":"2015-06-28T10:04:51Z","git_url":"git://github.com/putaindecode/putaindecode.fr.git","ssh_url":"git@github.com:putaindecode/putaindecode.fr.git","clone_url":"https://github.com/putaindecode/putaindecode.fr.git","svn_url":"https://github.com/putaindecode/putaindecode.fr","homepage":"http://putaindecode.fr","size":46489,"stargazers_count":72,"watchers_count":72,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":55,"mirror_url":null,"open_issues_count":40,"forks":55,"open_issues":40,"watchers":72,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467"},"html":{"href":"https://github.com/putaindecode/putaindecode.fr/pull/467"},"issue":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/467"},"comments":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/issues/467/comments"},"review_comments":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467/comments"},"review_comment":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/pulls/467/commits"},"statuses":{"href":"https://api.github.com/repos/putaindecode/putaindecode.fr/statuses/ddb42c6d4af11649919b8194801a35402bc68dec"}}}}