Comment aplatir une image Docker?
J'ai fait un conteneur Docker qui est assez grand. Lorsque je remets le conteneur pour créer une image, l'image est d'environ 7,8 GO big. Mais quand je export
le récipient (pas save
l'image!) pour une archive et la ré-importez, l'image n'est que de 3 GO big. Bien sûr, l'histoire est perdu, mais ce est OK pour moi, l'image est "fait" à mon avis, et prêt pour le déploiement.
Comment puis-je aplatir une image/conteneur sans l'exporter sur le disque et de l'importer de nouveau? Et: Est-ce une bonne idée de le faire ou ai-je raté quelque point important?
- Voulez-vous construire avec le
--rm
option? Cela supprime les images intermédiaires. Ou le fait que j'ai mal compris la question? - Il y a quelques autres astuces pour faire de la taille de l'image: appelez un tas d'installer les commandes dans un
RUN
, supprimer les paquets d'ubuntu, etc. Voir github.com/dckc/ipython-docker/blob/master/Dockerfile pour un bon exemple.
Vous devez vous connecter pour publier un commentaire.
De Docker 1.13, vous pouvez utiliser le
--squash
drapeau.Avant la version 1.13:
À ma connaissance, vous ne pouvez pas utiliser le Support de l'api.
docker export
etdocker import
sont conçus pour ce scénario, comme vous l'avez déjà dit.Si vous ne voulez pas enregistrer sur le disque, vous pourriez probablement la pipe de l'outputstream de l'exportation dans le flux d'entrée d'importation. Je n'ai pas testé, mais essayez
--squash
nécessite expérimentale drapeaux de certains démons.export
travaux sur les conteneurs, pas les images. Avez-vous des suggestions sur la façon de convertir une image dans un conteneur sans courir rien à l'intérieur de cette image? Une idée que j'ai est d'exécuter un point d'entrée qui n'existe pas dans le conteneur. Qui semble toujours créer un nouveau conteneur.--squash
est la meilleure manière de les aplatir et conserver les métadonnées?--squash
drapeau?Maintenant que Docker a publié le multi-stade construit en 17.05, vous pouvez le reformater votre build pour ressembler à ceci:
Le résultat sera votre environnement de génération de couches sont mises en cache sur le serveur de build, mais seulement une copie aplatie existent dans l'image que vous avez de la balise et de pousser.
Note, vous devez généralement reformuler ce d'avoir un complexe de construire l'environnement et ne copie sur un certain nombre de répertoires. Voici un exemple avec une Aller faire une seule image binaire à partir du code source et une version unique de la commande sans l'installation d'Aller sur l'ordinateur hôte et la compilation de l'extérieur de docker:
Le fichier aller est un simple bonjour tout le monde:
L'accumulation crée deux environnements, l'environnement de compilation et de le gratter, puis les balises de la gratter:
En regardant les images, seul le binaire est à l'image d'être expédiés, alors que l'environnement est de plus de 700MO:
Et oui, il s'exécute:
COPY
réécrit tous les systèmes de fichiers propriété de root (ou de l'utilisateur qui exécute la commande) qui peut ne pas être souhaitable.Construire l'image avec le
--squash
drapeau:https://docs.docker.com/engine/reference/commandline/build/#squash-an-images-layers-squash-experimental-only
Également envisager de nettoyer les fichiers inutiles, tels que l'apt cache:
EXÉCUTER
apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*