Dockerignore: ignorer tout sauf un fichier et le Dockerfile

89

L'intention principale était donc d'ancrer une application Fat Jar et de la placer dans Elasticbeanstalk. Le problème vient du contexte. C'est un peu stupide d'ajouter autant de contexte dans le docker si tout ce dont j'ai besoin est en fait un seul fichier jar.

J'ai joué avec le fichier .dockerignore, mais je suis perdu. J'ai essayé d'utiliser la négation gitignore, mais cela ne fonctionne pas.

*
!Dockerfile
*/
!target/
target/*
!target/*.jar

Il y a aussi cette chose avec les regex, mais il semble que les regex compliquées ne soient pas prises en charge.

^((?!Dockerfile).)*$

J'ai également essayé de rechercher dans stackoverflow, et ces deux sont tout ce que j'ai trouvé:

Cette question pourrait être similaire à la deuxième, mais je pense que c'est une légère différence car ici, je veux simplement inclure un seul fichier dans le contexte.

Toute aide serait appréciée.

Rowanto
la source
Le point d'exclamation pour les dossiers fonctionne pour moi!
Ivan Aracki

Réponses:

127

Si vous devez tout ignorer sauf certains répertoires ou fichiers et ignorer également certains fichiers inutiles dans ces répertoires autorisés, vous pouvez utiliser le .dockerignorefichier suivant :

# Ignore everything
**

# Allow files and directories
!/file.txt
!/src/**

# Ignore unnecessary files inside allowed directories
# This should go after the allowed directories
**/*~
**/*.log
**/.DS_Store
**/Thumbs.db
Mauricio Sánchez
la source
8
Selon la documentation de Docker, il devrait être suffisant de ne mettre que *sur la première ligne (au lieu de **). Quote: "vous voudrez peut-être spécifier les fichiers à inclure dans le contexte, plutôt que ceux à exclure. Pour ce faire, spécifiez *comme premier modèle, suivi d'un ou plusieurs !modèles d'exception".
Johnny Thunderman du
31

À partir de la référence du fichier dockerfile :

Au-delà des règles filepath.Match de Go, Docker prend également en charge une chaîne générique spéciale ** qui correspond à n'importe quel nombre de répertoires (y compris zéro). Par exemple, ** / *. Go exclura tous les fichiers se terminant par .go qui se trouvent dans tous les répertoires, y compris la racine du contexte de construction.

Ainsi, une ligne contenant simplement ** ignorera tout dans le même répertoire que le Dockerfile.

Comme prévu, l'exclamation peut ensuite être utilisée pour référencer tous les fichiers que vous souhaitez envoyer au démon docker.

abonder
la source
3
Il est extrêmement important que le **passe en haut du fichier, sinon les exclusions seront ignorées. Docker utilise la dernière règle qui correspond comme règle «finale», donc si elle **est la dernière, elle correspondra à tout.
tedivm
3
Ajoutez donc **sur la première ligne et !foosur la ligne suivante si fooc'est le seul fichier que vous souhaitez inclure.
Saca
9

Cela peut sembler étrange, mais si vous n'avez besoin que d'un seul fichier jar, vous pouvez créer un dossier «docker» dans votre système de construction qui contient votre Dockerfile. Lorsque vous exécutez vos builds, demandez aux scripts de build de copier le fichier jar unique dans "docker", puis d'exécuter la build de l'image docker (depuis le dossier "docker") et de la pousser vers votre registre docker une fois terminé.

Jay Atkinson
la source
2
Salut, cela ne semble pas du tout étrange. Je pensais que c'était une pratique générale, mais je cherchais un moyen de le faire avec le .dockerignore si possible. En plus, je n'aime pas vraiment mvn xml :)
Rowanto
Vous pouvez combiner les deux approches en plaçant le fichier dockerfile dans un sous-répertoire et en utilisant .dockerignore. Selon la documentation, il est bon de le faire de toute façon
Jonathan Lee
Documentation de Docker : Dans la plupart des cas, il est préférable de commencer avec un répertoire vide comme contexte et de conserver votre Dockerfile dans ce répertoire. Ajoutez uniquement les fichiers nécessaires à la création du Dockerfile. Avertissement: n'utilisez pas votre répertoire racine, /, comme PATH, car il entraîne le transfert de la totalité du contenu de votre disque dur vers le démon Docker.
Jonathan Lee le