2017-06-09 3 views
0

J'emballe l'application de python dans le docker avec le dockerTools de nix et tout est bon excepté la taille d'image. Python lui-même est d'environ 40Mb, et si vous ajoutez numpy et pandas ce serait quelques centaines de mégaoctets, alors que le code de l'application est seulement ~ 100Kb. La seule solution que je vois est d'emballer les dépendances dans une image séparée et d'en hériter la principale, cela ne réglera pas la taille, mais au moins je n'aurai pas besoin de transférer des images énormes sur chaque commit. Aussi, je ne sais pas comment faire cela, dois-je utiliser une image avec nix, ou construire un environnement avec pythonPackages.buildEnv et l'attacher mon application?Réduire la taille du conteneur de docker construit avec nix

Ce serait génial d'avoir une solution générique, mais python spécifique serait bon. Même si vous avez une solution imparfaite, s'il vous plaît partager.

Ok, avec fromImage attr pour buildImage Je divise une énorme couche en une énorme couche de dépendance et une petite couche de code d'application. Je me demande s'il existe un moyen de déplacer cette couche de dépendance aux graisses dans une image séparée, afin que je puisse la partager parmi mes autres projets?

Répondre

0

Après googler un peu et la lecture dockerTools code, je fini avec cette solution:

let 
    deps = pkgs.dockerTools.buildImage { 
    name = "deps"; 
    content = [ list of all deps here ]; 
}; 
in pkgs.dockertools.buildImage { 
    name = "app"; 
    fromImage = deps; 
} 

Cela va construire deux couches image docker, l'un d'entre eux des dépendances, l'autre est l'application. Aussi est semble que la valeur pour fromImage pourrait être le résultat de pullImage qui devrait vous donner le même résultat (si j'ai bien compris le code), mais je n'ai pas pu le vérifier.

0

Il n'est pas nécessaire d'empaqueter vos dépendances dans une image distincte et d'en hériter, même si cela ne peut pas nuire.

Tout ce que vous devez faire est de vous assurer que vous ajoutez votre code d'application comme l'une des dernières étapes dans le Dockerfile. Chaque commande aura son propre calque, donc si vous changez seulement le code de votre application, tous les calques au-dessus de cette modification peuvent être utilisés à partir du cache.

Exemple de la documentation Docker Images and Layers:

Le dockerfile

FROM ubuntu:15.10 
COPY . /app 
RUN make /app 
CMD python /app/app.py 

contient quatre couches distinctes. Si vous ne modifiez que la dernière ligne, seul ce calque et tous les calques en dessous devront être transférés. En poussant ou en tirant, vous verrez 4b0ba2c4050a: Already exists à côté des couches utilisées depuis le cache. En suivant cette approche, vous ne vous retrouvez pas avec une image plus petite, mais comme vous le dites, vous n'avez pas besoin de tirer de grandes images à chaque changement.