Publié le 26 Septembre 2016

Il peut être intéressant de limiter les nombres de cores CPU disponible pour un conteneur.

Par exemple on peut vouloir n'utiliser qu'un seul core pour les conteneurs docker de façon à laisser assez de CPU disponible pour l'hôte.

docker permet de préciser les cores CPU utilisable par un conteneur grâce à l'option --cpus-set.

Cette option accept soit une liste de nombres et/ou d'intervalles.

Par exemple

--cpus-set 0 # CPU 0
--cpus-set 0-3 # CPU 0, 1, 2 et 3
--cpus-set 0,2-4 # CPU 0, 2, 3 et 4

et dans une commande docker run ça donne quelque chose comme:

docker run --cpus-set 0 <image> <commande>

Voir les commentaires

Rédigé par Bliz

Publié dans #docker

Publié le 23 Septembre 2016

Si vous utilisez git avec les feature branch vous avez probablement beaucoup de branch qui ont été mergées et qui ne servent plus à rien mais qui reste là car c'est un peu ennuyeux de les supprimer manuellement.

En revanche sur le repo central les branches mergées sont souvent supprimées automatiquement lorsqu'on merge la pull request associée.

Et bien on peut simplement profiter de ce fait lorsqu'on met à jour notre repo local. Il suffit d'utiliser l'option --prune lorsqu'on pull/fetch le repo central.

git fetch --prune

ou

git pull --prune

Voir les commentaires

Rédigé par Bliz

Publié dans #git

Publié le 19 Septembre 2016

Si vous utilisez docker vous avez surement remarqué que l'espace disque utilisé augmente rapidement. Voici quelques règles pour économiser un peu de place sur votre disque.

Supprimer les volumes associés à un conteneur

Lorsqu'on supprime un conteneur penser à utiliser l'option -v qui permet de supprimer les volumes associés à un conteneur.

Pour supprimer tous les conteneurs qui ne tournent pas on peut utiliser la commande suivante:

docker rm -v $(docker ps -aqf status=exited)

Recréé un conteneur est assez rapide du moment que son image est disponible. Ce qui nous amène vers le nettoyage des images inutiles.

Supprimer les images inutiles

J'appelle image "inutile" une image "intermédiaire" qui sert dans la construction d'une image "finale" et qui n'est donc jamais utilisé pour créer un conteneur.

On peut supprimer ces images avec la commande suivante:

docker rmi $(docker images -qf dangling=true)

Souvent indispensable après un docker pull.

Supprimer les volumes orphelins

Un volume orphelin est un volume pour lequel son conteneur associé a été supprimé sans l'option -v. Pour supprimer ces volumes on a la commande suivante:

docker volume rm $(docker volume ls -qf dangling=true)

Voir les commentaires

Rédigé par Bliz

Publié dans #docker

Publié le 16 Septembre 2016

J'ai récemment eu un build sbt qui échouait à cause d'un OutOfMemory exception.

La solution: donner plus de mémoire à sbt. Et la bonne nouvelle c'est que c'est maintenant beaucoup plus simple. Il suffit d'ajouter l'option -mem. Par exemple:

sbt -mem 2048 run

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Publié le 13 Septembre 2016

Dans un fichier build.sbt les dépendances se déclarent de la façon suivante:

libraryDependencies += "org.nd4j" % "nd4j-native-platform" % "0.5.0"

mais parfois on trouve aussi un double pourcent "%%"

libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.4.8"

Quelle est la différence ?

Dans le premier cas (%) on déclare une dépendance vers une librairie java (qui ne dépend pas de la version de scala donc). Dans ce cas le % est suffisant.

Dans le deuxième cas on déclare une dépendance vers une librairie scala qui dépend de la version de scala. Le %% ajoute automatiquement la version de scala au nom de la librairie.

C'est donc équivalent à ceci:

libraryDependencies += "com.typesafe.akka" % "akka-actor_2.11" % "2.4.8"

Notez le suffixe '_2.11' à la fin du nom de la librairie. Le %% permet de l'ajouter automatiquement.

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala

Publié le 12 Août 2016

En ce moment je développe une application play scala et j'utilise donc sbt pour compiler et lancer mon application.

Le moyen le plus simple que j'ai trouvé pour la debugger et de lancer l'appli avec l'option -jvm-debug:

sbt -jvm-debug 9999 run

Ensuite j'utilise mon IDE (IntelliJ dans mon cas) que je configure pour debugger une application distante sur le port que j'ai spécifier avec l'option -jvm-debug.

Voir les commentaires

Rédigé par Bliz

Publié dans #Scala, #Play

Publié le 14 Juillet 2016

Pour accéder un répertoire local depuis un conteneur docker il faut le monter en temps que volume docker. C'est l'équivalent des "shared folders" de Virtual box.

La définition d'un volume s'effectue avec l'option -v de manière similaire au mapping des ports.

Par exemple pour accéder à son répertoire "home" depuis docker on utilisera la commande suivante:

docker run -it -v $HOME:/shared ubuntu /bin/bash

L'option -v précise que le répertoire /shared à l'intérieur du conteneur docker correspond au $HOME de l'utilisateur hôte.

Voir les commentaires

Rédigé par Bliz

Publié dans #docker

Publié le 12 Juillet 2016

En gros un docker registry est une bibliothèques d'images docker. Il y a docker hub qui est le docker registry officiel de docker mais la plupart des entreprises avec qui je travaille utilise leur propre docker registry.

En fait il est assez simple de mettre en place en tel registry en utilisant docker bien sûr et l'image registry:

docker run -d -p 5000:5000 -v $HOME/registry:/var/lib/registry registry

Comme ce registry n'est pas sécurisé (pas de docker login nécessaire pour y accéder) il faut redémarrer le daemon docker avec l'option --insecure-registry HOSTNAME.

Ensuite on peut faire des push/pull sur ce registry:

docker push HOSTNAME:5000/image:tag

docker pull HOSTNAME:5000/image:tag

Voir les commentaires

Rédigé par Bliz

Publié dans #docker

Publié le 12 Juillet 2016

L'option -p de docker run permet de mapper le port d'un conteneur vers un port de l'hôte. Par exemple pour accéder un service web on utilisera docker run -p 9000:80 ... pour mapper le port 80 du conteneur vers le port 9000 de l'hôte.

Il peut y avoir des services pour lesquels il n'est pas nécessaire d'exposer un port externe. Par contre un autre conteneur docker peut y avoir accès. Par exemple un service web peut avoir besoin d'accéder une base de données mais il n'y a pas de raison de rendre la base de données accessible en dehors de docker.

Dans ce cas on dit qu'on lit le service web à la base données avec l'option --link.

Pour démarrer la base de données on utilisera:

docker run --name mysql_wp -e MYSQL_ROOT_PASSWORD=**** -d mysql

Une fois le conteneur démarrer un peut démarrer le service web (ici wordpress) avec

docker run --name ws --link ws_mysql:mysql -p9000:80 -d wordpress

Voir les commentaires

Rédigé par Bliz

Publié dans #docker

Publié le 11 Juillet 2016

Ghostscript (gs) permet de générer un fichier PDF à partir de plusieurs PDFs.

Ghostscript est évidement disponible sous linux mais également sur Mac.

brew install ghostscript

La commande gs est très puissante et très complexe à la fois. Il faut donc l'utiliser avec les bonnes options. Dans notre cas la commande est la suivante

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=docs.pdf doc1.pdf doc2.pdf do3.pdf

Ce qui est vraiment intéressant c'est la fin de la commande, notamment l'option -sOutputFile qui permet de spécifier le nom du ficher de sortie (c'est à dire de celui comprenant tous les PDFs).

Ensuite la fin de la commande n'est que la liste des fichiers PDFs à regrouper séparé par des espaces.

Voir les commentaires

Rédigé par Bliz

Publié dans #Linux