Comment ajouter un fichier à une image dans le Dockerfile sans l'aide de l'AJOUT ou de la COPIE de la directive
J'ai besoin de le contenu d'un grand *.zip
fichier (5 go) dans mon Docker
conteneur afin de compiler un programme. Le *.zip
fichier se trouve sur ma machine locale. La stratégie pour ce serait:
COPY program.zip /tmp/
RUN cd /tmp \
&& unzip program.zip \
&& make
Après avoir fait cela, je voudrais supprimer le répertoire dézippé et l'original *.zip
fichier parce qu'ils ne sont pas nécessaire, pas plus. Le problème est que le COPY
(et aussi le ADD
directive) permettra d'ajouter un calque à l'image qui contiendra le fichier program.zip
qui est problématique, comme peut l'image sera d'au moins 5 go de gros. Est-il possible d'ajouter un fichier dans un conteneur sans l'aide de COPY
ou ADD
directive? wget
ne fonctionnera pas comme mentionné *.zip
fichier sur ma machine locale et curl file://localhost/home/user/program.zip -o /tmp/program.zip
ne fonctionnera pas non plus.
- Ne pouvez-vous pas simplement décompresser au préalable sur votre machine locale? Puis ajouter les trucs dont vous avez besoin?
- Oui, mais je veux aussi supprimer le dossier décompressé comme il sera encore plus de 5 go. Mais j'ai trouvé un moyen pour faire ce que je veux. La réponse est sur son chemin.
- et un make.sh fichier qui ne le construire et supprime le fichier?
- Une couche avec les
*.zip
sera toujours une partie de l'image. Pourriez vous m'expliquer comment un script shell aiderait?
Vous devez vous connecter pour publier un commentaire.
Il n'est pas simple, mais il peut être fait par
wget
oucurl
avec un peu de soutien depython
. (Tous les trois outils devrait normalement être disponible sur un*nix
système.)wget
ne fonctionnera pas si vous neurl
est donné etne fonctionnera pas dans une
Dockerfile
'sRUN
instruction. Par conséquent, nous avons besoin d'un serveur quiwget
etcurl
pouvez consulter et téléchargerprogram.zip
de.Pour ce faire, nous avons mis en place un peu
python
serveur qui sert noshttp
demandes. Nous serons à l'aide de lahttp.server
module depython
pour cela. (Vous pouvez utiliserpython
oupython 3
. Il va travailler avec les deux.).La
python
serveur de servir tous les fichiers dans le répertoire, il est lancé. Donc, vous devriez assurez-vous que vous démarrez votre serveur dans le répertoire le fichier que vous souhaitez télécharger lors de votre image de construire réside dans ou créez un répertoire temporaire qui contient votre programme. À des fins d'illustration nous allons créer le fichierfoo.txt
qui nous permettra plus tard de télécharger viawget
dans notreDockerfile
:Lors du démarrage du serveur http, il est important, que nous spécifier l'adresse IP de notre machine locale sur le réseau local. En outre, nous allons ouvrir le Port 8000. Ayant fait cela, nous devrions voir la sortie suivante:
Maintenant, nous construisons un
Dockerfile
pour illustrer comment cela fonctionne. (Nous supposons que le fichierfoo.txt
doit être téléchargé dans/tmp
):Maintenant nous commençons à le construire avec
Au cours de la construction, vous verrez la sortie suivante sur notre
python
serveur:et la sortie de la construction de notre image sera:
Vous pouvez ensuite vérifier si cela a vraiment fonctionné en commençant et en entrant un conteneur de l'image que vous venez de créer:
Vous pouvez ensuite regarder dans
/tmp
pourfoo.txt
.Nous pouvons maintenant ajouter un fichier pour notre
image
sans créer un nouveau calque. En supposant que vous souhaitez ajouter un programme d'environ 5 go, comme mentionné dans la question que nous pourrions faire:De cette façon, nous ne seront pas laissés avec 10 go de fichiers inutiles.
Il n'y a aucun moyen de le faire. Une demande de fonctionnalité est ici https://github.com/docker/docker/issues/3156.
Pouvez-vous pas la carte d'un dossier local vers le conteneur quand il est lancé, puis copiez les fichiers dont vous avez besoin.
https://docs.docker.com/userguide/dockervolumes/
Dockerfile
en fonction de la solution.J'ai posté une semblable réponse ici: https://stackoverflow.com/a/37542913/909579
Vous pouvez utiliser docker-squash de squash calques créés. Qui sera essentiellement supprimer l'archive à partir de l'image finale, si vous l'enlever dans la suite
RUN
instruction.