Comment inclure des fichiers en dehors du contexte de construction de Docker?

Comment puis-je inclure des fichiers en dehors du contexte de construction de Docker en utilisant la commande "ajouter" dans le fichier Docker?

à Partir du menu fixe de la documentation:

le chemin doit être dans le contexte de la construction; vous ne pouvez pas ajouter ../ quelque chose / quelque chose, parce que la première étape d'une construction docker est de envoyer le répertoire de contexte (et les sous-répertoires) au démon docker.

je ne veux pas restructurer tout mon projet juste pour accommoder Docker dans cette affaire. Je veux garder tous mes fichiers Docker dans le même sous-répertoire.

aussi, il semble que Docker ne supporte pas encore (et peut ne pas jamais) symlinks: Dockerfile ADD command does not follow symlinks on host #1676.

la seule autre chose à laquelle je peux penser est d'inclure une étape de pré-construction pour copier les fichiers dans le contexte de construction du Docker (et configurer ma version contrôle d'ignorer ces fichiers). Est-il une meilleure solution pour que cela?

198
demandé sur Tshepang 2014-11-21 22:11:28

6 réponses

la meilleure façon de contourner cela est de spécifier le fichier Dockerfile indépendamment du contexte de construction, en utilisant-F.

par exemple, cette commande donnera à la commande ADD L'accès à tout ce qui se trouve dans votre répertoire courant.

docker build -f docker-files/Dockerfile .

mise à jour : Docker permet désormais d'avoir le fichier Dockerfile en dehors du contexte de construction (corrigé dans 18.03.0-ce, https://github.com/docker/cli/pull/886 ). Donc vous pouvez aussi faire quelque chose comme

docker build -f ../Dockerfile .
183
répondu Cyberwiz 2018-07-21 06:49:01

sous Linux, vous pouvez monter d'autres répertoires au lieu de les symlinker ""

mount --bind olddir newdir

voir https://superuser.com/questions/842642 pour plus de détails.

Je ne sais pas si quelque chose de similaire est disponible pour d'autres OS. J'ai également essayé D'utiliser Samba pour partager un dossier et le remonter dans le contexte Docker qui a fonctionné aussi bien.

34
répondu Günter Zöchbauer 2017-03-20 10:18:19

je me retrouve souvent à utiliser l'option --build-arg à cette fin. Par exemple, après avoir mis ce qui suit dans le fichier Dockerfile:

ARG SSH_KEY
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa

il Vous suffit de faire:

docker build -t some-app --build-arg SSH_KEY="$(cat ~/file/outside/build/context/id_rsa)" .
22
répondu user2658308 2017-11-29 04:21:35

si vous lisez la discussion dans le numéro 2745 non seulement docker ne peut jamais supporter les liens symboliques, ils ne peuvent jamais supporter l'ajout de fichiers en dehors de votre contexte. Semble être une philosophie de conception que les fichiers qui vont dans la construction docker devrait explicitement faire partie de son contexte OU être à partir d'une URL où il est probablement déployé aussi avec une version fixe de sorte que la construction est répétable avec des URLs bien connues ou des fichiers expédiés avec le conteneur docker.

je préfère construire à partir d'une version contrôlée source-ie construire docker - t stuff http://my.git.org/repo - sinon je construis à partir d'un endroit aléatoire avec des fichiers aléatoires.

fondamentalement, aucune.... -- SvenDowideit, Docker Inc

juste mon avis Mais je pense que vous devriez restructurer pour séparer le code et les dépôts de dockers. De cette façon, les conteneurs peuvent être génériques et tirer dans n'importe quelle version de le code à l'exécution plutôt que le temps de construction.

alternativement, utilisez docker comme votre artefact fondamental de déploiement de code et ensuite vous mettez le fichier dockerfile dans la racine du dépôt de code. si vous empruntez cette route, il est probablement logique d'avoir un conteneur Docker parent pour plus de détails généraux sur le niveau du système et un conteneur enfant pour la configuration spécifique à votre code.

16
répondu Usman Ismail 2016-01-22 15:50:05

je crois que la solution la plus simple serait de changer le "contexte" lui-même.

ainsi, par exemple, au lieu de donner:

docker build -t hello-demo-app .

qui définit le répertoire courant comme contexte, disons que vous vouliez le répertoire parent comme contexte, utilisez simplement:

docker build -t hello-demo-app ..
3
répondu Anshuman Manral 2017-09-13 15:14:38

vous pouvez aussi créer une archive de ce dont l'image a besoin en premier et l'utiliser comme contexte.

https://docs.docker.com/engine/reference/commandline/build/#/tarball-contexts

0
répondu Laurent Picquet 2016-09-12 10:46:52