Comment ajouter des objets.dockerignore?

Je ne suis pas en mesure de trouver beaucoup d'exemples de ce que A.le fichier dockerignore devrait ressembler à ça.

l'utilisation de puppet pour installer quelques paquets sur un conteneur docker fait exploser l'image de 600 Mo à 3 Go. Je suis en train d'utiliser un .dockerignore le fichier de garder la taille d'un minumum

$ cat Dockerfile  
FROM centos:centos6

#Work around selinux problem on cent images
RUN yum install -y --enablerepo=centosplus libselinux-devel

RUN yum install -y wget git tar openssh-server; yum -y clean all

Add Puppetfile / 
RUN librarian-puppet install
RUN puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}"
RUN librarian-puppet clean

si je cours docker images --tree je peux voir que l'image instantlly pousse par plusieurs GO

$ docker images --tree
                ├─e289570b5555 Virtual Size: 387.7 MB
                │ └─a7646acf90d0 Virtual Size: 442.5 MB
                │   └─d7bc6e1fbe43 Virtual Size: 442.5 MB
                │     └─772e6b204e3b Virtual Size: 627.5 MB
                │       └─599a7b5226f4 Virtual Size: 627.5 MB
                │         └─9fbffccda8bd Virtual Size: 2.943 GB
                │           └─ee46af013f6b Virtual Size: 2.943 GB
                │             └─3e4fe065fd07 Virtual Size: 2.943 GB
                │               └─de9ec3eba39e Virtual Size: 2.943 GB
                │                 └─31cba2716a12 Virtual Size: 2.943 GB
                │                   └─52cbc742d3c4 Virtual Size: 2.943 GB
                │                     └─9a857380258c Virtual Size: 2.943 GB
                │                       └─c6d87a343807 Virtual Size: 2.964 GB
                │                         └─f664124e0080 Virtual Size: 2.964 GB
                │                           └─e6cc212038b9 Virtual Size: 2.964 GB Tags: foo/jenkins-centos6-buildslave:latest

je crois que la raison que l'image devient tellement importante, c'est parce que librarian-puppet clones d'un marionnettes du module /modules qui casse le cache de compilation

j'ai essayé le suivant .dockerignore fichiers sans chance.

$ cat .dockerignore
/modules
/modules/
/modules/*

Est-ce la bonne syntaxe .dockerignore fichier?

Existe-il d'autres moyens de prévenir ces conteneurs de croissance si grand?

Supplémentaires informations:

http://kartar.net/2013/12/building-puppet-apps-inside-docker/

http://danielmartins.ninja/posts/a-week-of-docker.html

17
demandé sur ConcurrentHashMap 2014-08-25 21:08:52

6 réponses

.dockerignore est d'empêcher les fichiers d'être ajoutés au contexte de construction initial qui est envoyé au démon docker lorsque vous faites docker build, il ne crée pas de règle globale pour exclure les fichiers d'être créés dans toutes les images générées par un fichier Dockerfile.

Il est important de noter que chaque RUN la déclaration générera une nouvelle image, le parent de cette image étant l'image générée par la déclaration Dockerfile au-dessus de celle-ci. Essayer de s'effondrer votre RUN déclarations en une seule l'autre pour réduire la taille de l'image:

RUN librarian-puppet install &&\
 puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" &&\
 librarian-puppet clean
26
répondu Abe Voelker 2014-09-09 16:45:34

le format du .dockerignore devrait être égal à celui de .gitignore. Voir un exemple de fichier et le menu fixe documentation.

le fichier doit être une liste des motifs d'exclusion (par rapport au chemin de .dockerignore file) séparé par une nouvelle ligne.

alors vous devriez essayer ce qui suit .dockerignore:

modules/*

/ au début, peut avoir été l'erreur, elle ne sera valable que pour le répertoire racine du fichier (mais pas pour les sous-répertoires, donc peut-être la version récursive sans le / fera un meilleur travail à la place).

17
répondu ConcurrentHashMap 2014-08-25 17:36:29

une autre façon de le faire, créer une image plus petite, est de exécuter bibliothécaire-marionnette dans l'accueil, pas en Docker, donc vous ne finissez pas avec bibliothécaire, ruby, gemmes,... installé dans l'image.

j'ai fini avec un 622MB image pour jenkins esclave à l'aide de Marionnettes, et un 480MB image sans Marionnette.

3
répondu csanchez 2014-09-18 10:44:04

ni L'un ni l'autre:

modules/*

ni

modules

ne serait pas travailler pour moi, docker gardé de polluer l'image avec les fichiers inutiles jusqu'à ce que je l'ai mis comme ceci:

**/modules

fonctionne également avec:

**/modules/*.py
3
répondu Kostyantyn 2017-08-02 15:59:07

http://docs.docker.com/articles/dockerfile_best-practices/

il me semble que votre approche est à l'envers (d'accord avec @csanchez), et que vous devriez générer votre conteneur docker à partir de puppet, pas courir puppet dans le conteneur...

vous devriez aussi && les lignes installer/appliquer/nettoyer ensemble... chaque commande docker crée une image incrémentale... S'il y a des fichiers temporaires/ressources qui font partie des centos yum commandes, vous devez également faire la même chose.

FROM centos:centos6

# Add your needed files first
# maybe you could use a baseimage and make this a volume mount point?
Add Puppetfile / 

# combine multiple commands with cleanup of cache/temporary
# space in the same run sequence to reduce wasted diff image space.

#Work around selinux problem on cent images
RUN yum install -y --enablerepo=centosplus libselinux-devel && \
    yum install -y wget git tar openssh-server; yum -y clean all && \
    librarian-puppet install && \
    puppet apply --modulepath=/modules -e "class { 'buildslave': jenkins_slave => true,}" && \
    librarian-puppet clean

j'avais REALLY suggérons d'éviter de SELINUX dans un conteneur, il ne vous donne pas à l'intérieur d'un conteneur. Sans mentionner que selon ce que vous essayez de créer, il y a des endroits plus petits à partir de centos6. Je crois qu'ubuntu est plus petit, debian: wheezy plus petit encore, ou même alpine pour point de départ minuscule.

Il est intéressant de noter que la taille de votre fichier, si vous utilisez un le système de fichiers qui supporte les montages virtuels, peut réutiliser la même image de base pour plusieurs instances, de sorte qu'elle ne se développe pas plus

2
répondu Tracker1 2015-04-14 22:46:19

L'optimisation de la taille de l'image du conteneur est le but principal derrière le .dockerignore comme il répondre à un objectif similaire à votre .gitignore comme il réduit la latence et le temps de réponse tout en fournissant des services. C'est vrai pour l'automatisation de déploiement comme Puppet, SaltStack ou Ansible. Timestamp défini pour le déploiement de l'exécution de service peut être échoué en raison de la plus grande taille de l'image et de la faible bande passante du réseau. Si. dockerignore aide à rendre la taille de l'image aussi petite que possible.

Vous pouvez placer dans le créer un contexte de répertoire qui nous préciser à la fin de docker commande de construction. Le fichier ci-dessous glob pattern pour les fichiers et les répertoires pour exclure ceux de l'image finale.

Supposons que j'ai un répertoire . img/ dans mon contexte de construction, et je veux l'exclure tout en construisant l'image, je vais simplement ajouter la ligne suivante .fichier dockerignore,

.img

et, si je veux exclure tous les fichiers commence . alors tout simplement, ajouter la ligne

.*

(Note: Ne pas confondre les Unix glob modèle est différent de celui des expressions Régulières)

en plus, j'exclurai quelques autres de mes fichiers de mon contexte de construction,

.*
docs
my-stack.dab
docker-compose.overrride.yml
test*
*.md
!README.md

ici,*.md la ligne exclut tous les fichiers markdown (j'ai beaucoup de fichiers markdown dans mon projet). Mais, je veux inclure README.md et pas d'autres fichiers markdown. Comme notre dernière ligne en haut, nous avons ajouté README.md avec ! ou l'exclure tout en excluant tous les autres fichiers de markdown.

ainsi, avec ceci nous pouvons réduire la hauteur de votre image de construction avec l'aide de .dockerignore et l'effet de levier pour rendre la taille de l'image plus petite.

0
répondu mohan08p 2017-06-04 08:22:49