Docker - Comment mettre à jour les images
J'ai lu que le panneau fonctionne avec des couches, de sorte que lors de la création d'un container
avec un Dockerfile
, vous commencez avec l'image de base, puis exécuter les commandes suivantes en rajouter une couche pour le conteneur, de sorte que si vous enregistrez l'état de ce nouveau conteneur, vous avez une nouvelle image. Il ya un couple de choses que je me demandais à ce sujet.
Si je commence à partir d'un Ubuntu
de l'image, ce qui est assez gros et volumineux, car c'est un système complet, puis-je ajouter un peu d'outils et l'enregistrer comme une nouvelle image qui j'ai télécharger sur le hub. Si quelqu'un télécharge mon image, et qu'ils ont déjà un Ubuntu image sauvegardée dans leur images folder
, est-ce à dire qu'ils peuvent ignorer le téléchargement Ubuntu
puisqu'ils ont déjà l'image? Si oui, comment cela fonctionne quand je modifie des parties de l'image d'origine, ne Docker utilisation de ses données mises en cache pour appliquer de manière sélective les changements apportés à la Ubuntu image
après il le charge?
2.) Comment puis-je mettre à jour une image que j'ai construit en modifiant le Dockerfile? - Je configurer un simple projet django avec cette Dockerfile
:
FROM python:3.5
ENV PYTHONBUFFERED 1
ENV APPLICATION_ROOT /app
ENV APP_ENVIRONMENT L
RUN mkdir -p $APPLICATION_ROOT
WORKDIR $APPLICATION_ROOT
ADD requirements.txt $APPLICATION_ROOT
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . $APPLICATION_ROOT
et utilisé pour créer l'image au début. Donc, chaque fois que je créer une boîte, il charge tous ces environment variables
, si je reconstruction de la boîte complètement il réinstalle les forfaits et tous les extras. J'ai besoin d'ajouter une nouvelle variable d'environnement, j'ai donc ajouté à la partie inférieure de la Dockerfile
, avec une variable de test:
ENV COMPOSE_CONVERT_WINDOWS_PATHS 1
ENV TEST_ENV_VAR TEST
Quand j'ai supprimer le conteneur et l'image, et de construire un nouveau conteneur, tout semble aller en conséquence, il me dit qu'il crée une nouvelle Étape 4 : ENV
COMPOSE_CONVERT_WINDOWS_PATHS 1
---> Running in 75551ea311b2
---> b25b60e29f18
Removing intermediate container 75551ea311b2
Si c'est comme quelque chose se perd dans certains de ces intermédiaires contenant des transitions. Est-ce la façon dont le système de mise en cache fonctionne, chaque nouvelle couche est un intermediate container
? Donc, avec cela à l'esprit, comment voulez-vous ajouter un nouveau calque, faites-vous de toujours avoir à ajouter de nouvelles données à la base de la Dockerfile? Ou serait-il préférable de laisser le Dockerfile seul une fois que l'image est construite, et ne modifier que le container
et construit une nouvelle image?
MODIFIER j'ai juste essayé d'installer une image, un paquet appelé bwawrik/bioinformatics
, qui est une CentOS conteneur qui a un large éventail d'outils est installé.
Il a gelé la moitié du chemin, j'ai donc quitté et il a ensuite couru de nouveau pour voir si tout a été installé:
$ docker pull bwawrik/bioinformatics
Using default tag: latest
latest: Pulling from bwawrik/bioinformatics
a3ed95caeb02: Already exists
a3ed95caeb02: Already exists
7e78dbe53fdd: Already exists
ebcc98113eaa: Already exists
598d3c8fd678: Already exists
12520d1e1960: Already exists
9b4912d2bc7b: Already exists
c64f941884ae: Already exists
24371a4298bf: Already exists
993de48846f3: Already exists
2231b3c00b9e: Already exists
2d67c793630d: Already exists
d43673e70e8e: Already exists
fe4f50dda611: Already exists
33300f752b24: Already exists
b4eec31201d8: Already exists
f34092f697e8: Already exists
e49521d8fb4f: Already exists
8349c93680fe: Already exists
929d44a7a5a1: Already exists
09a30957f0fb: Already exists
4611e742e0b5: Already exists
25aacf0148db: Already exists
74da82504b6c: Already exists
3e0aac083b86: Already exists
f52c7e0ac000: Already exists
35eee92aaf2f: Already exists
5f6d8eb70885: Already exists
536920bfe266: Already exists
98638e678c51: Already exists
9123956b991d: Already exists
1c4c8a29cd65: Already exists
1804bf352a97: Already exists
aa6fe9359956: Already exists
e7e38d1250a9: Already exists
05e935c831dc: Already exists
b7dfc22c26f3: Already exists
1514d4797ffd: Already exists
Digest: sha256:0391808e21b7b5cc0eb44fc2dad0d7f5415115bdaafb4534c0b6a12efd47a88b
Status: Image is up to date for bwawrik/bioinformatics:latest
Donc définitivement installé le package en morceaux, pas tous d'un coup. Ces morceaux sont-ils, les différentes images?
OriginalL'auteur Horse O'Houlihan | 2017-01-12
Vous devez vous connecter pour publier un commentaire.
image vs conteneur
Tout d'abord, permettez-moi de clarifier certains termes.
image: statique, immuable objet. C'est la chose que vous avez à construire lorsque vous exécutez
docker build
à l'aide d'unDockerfile
. Une image n'est pas une chose qui s'exécute.Images sont composés de couches. une image peut avoir une seule couche, ou il peut avoir de nombreuses couches.
conteneur: Une chose en cours d'exécution. Il utilise une image à partir d'un modèle.
Ceci est similaire à un fichier binaire du programme et un processus. Vous avez une version binaire du programme sur le disque (comme
/bin/sh
), et lorsque vous l'exécutez, c'est un processus sur votre système. Ceci est similaire à la relation entre les images et les conteneurs.L'ajout de couches d'une image de base
Vous pouvez construire votre propre image à partir d'une image de base (tels que
ubuntu
dans votre exemple). Certaines commandes dans votreDockerfile
va créer un nouveau calque dans l'image ultime. Certains de ceux qui sontRUN
,COPY
, etADD
.La première couche n'a pas de parent couche. Mais chaque couche d'une couche de parent. De cette façon, ils renvoient l'un à l'autre, de s'entasser comme des crêpes.
Chaque couche possède un IDENTIFIANT unique (le long hexadécimal hachages vous l'avez déjà vu). Elles peuvent aussi avoir de l'homme convivial noms, connus comme tags (par exemple
ubuntu:16.04
).Qu'est-ce que une couche par rapport à une image?
Techniquement, chaque couche est aussi une image. Si vous construisez une nouvelle image et il a 5 couches, vous pouvez utiliser cette image et il contiendra tous les 5 couches. Si vous exécutez un conteneur à l'aide de la troisième couche de la pile de votre ID de l'image, vous pouvez le faire aussi - mais il ne contient 3 couches. Celle que vous spécifiez et les deux qui sont ses ancêtres.
Mais comme une question de convention, le terme "image" désigne généralement la couche qui a une balise associée. Lorsque vous exécutez
docker images
, il vous montrera tout de haut-niveau des images, et de masquer les calques en dessous (mais vous pouvez l'afficher tous avec-a
).Ce qui est un intermédiaire conteneur?
Quand
docker build
s'exécute, il fait tout son travail à l'intérieur de conteneurs (naturellement!) Donc, si il rencontre unRUN
étape, il va créer un conteneur dans le courant de la couche supérieure, exécutez les commandes spécifiées dans, puis d'enregistrer le résultat comme un nouveau calque. Ensuite, il va créer un conteneur à partir de cette nouvelle couche, exécutez la prochaine chose... etc.L'intermédiaire des conteneurs sont utilisés uniquement pour le processus de construction, et sont jetés après la construction.
Comment la couche de systèmes de fichiers de travail
Vous demande si quelqu'un téléchargement de votre
ubuntu
image ne sont que de faire un téléchargement partiel, si ils ont déjà eu l'ubuntu
image localement.Oui! C'est exactement ça.
Chaque couche utilise la couche en dessous d'elle comme une base. Le nouveau calque est en fait un diff entre cette couche et un nouvel état. Ce n'est pas une diff de la même manière qu'un git commit pourrait fonctionner, cependant. Il fonctionne au niveau du fichier, non pas à la ligne de niveau.
Dire que vous avez commencé à partir
ubuntu
, et que vous avez exécuté cette Dockerfile.Cela aurait pour conséquence une à deux couches de l'image. La première couche serait le
ubuntu
image. La deuxième aurait probablement seulement une poignée de changements./etc/passwd
avec l'utilisateur "dan"/etc/group
avec le groupe "dan"/home/dan
/home/dan/.bashrc
Et c'est tout. Si vous commencez un conteneur à partir de cette image, ces quelques fichiers dans la couche supérieure, et tout le reste viendrait du système de fichiers dans le
ubuntu
image.Le haut de la lecture-écriture couche dans un récipient
Un autre point. Lorsque vous exécutez un conteneur, vous pouvez écrire des fichiers dans le système de fichiers. Mais si vous vous arrêtez le conteneur et d'exécuter un autre conteneur à partir de la même image, tout est remis à zéro. Alors, où sont les fichiers écrits?
Images sont immuables, donc une fois qu'ils existent, ils ne peuvent pas être modifiés. Vous pouvez créer une nouvelle version, mais c'est une nouvelle image. Il aurait un ID différent et ne serait pas la même image.
Un conteneur a un premier niveau de lecture-écriture de la couche qui est mis sur le dessus des calques de l'image. Toutes les écritures se produire dans cette couche. Il fonctionne exactement comme les autres couches. Si vous avez besoin de modifier un fichier (ou en ajouter un, ou d'en supprimer un), ce qui est fait dans la couche supérieure, et n'affecte pas les couches inférieures. Si le fichier existe déjà, il est copié dans le lire-écrire couche, puis modifié. Ceci est connu comme la copie sur écriture (de la Vache).
Où ajouter les changements
Avez-vous à ajouter de nouvelles choses au fond de Dockerfile? Non, vous pouvez ajouter n'importe quoi n'importe où (ou de changer quoi que ce soit).
Cependant, la façon dont vous faites les choses ne nuire à votre temps de construire en raison de la façon dont la construction de la mise en cache fonctionne.
Docker va essayer de mettre en cache les résultats lors des générations. Si elle trouve qu'il se lit à travers Dockerfile que le
FROM
est la même, la premièreRUN
est le même, la secondeRUN
est le même... il va supposer qu'il a déjà fait ces étapes, et d'utiliser des résultats mis en cache. S'il rencontre quelque chose qui est différent de la dernière génération, il va invalider le cache. Tout à partir de ce point, elle sera ré-exécuter frais.Certaines choses vont toujours invalider le cache. Par exemple, si vous utilisez
ADD
ouCOPY
, ceux qui sont toujours invalider le cache. C'est parce que Docker ne garde la trace de ce que les ordres de construction. Elle ne cherche pas à comprendre "est-ce la version du fichier que je suis en copiant le même que la dernière fois?"Donc, c'est une pratique courante pour commencer
FROM
, puis de les mettre très statique des choses commeRUN
commandes d'installer des paquets avec, par exemple,apt-get
, etc. Ces choses ont tendance à ne pas beaucoup changer après votre Dockerfile a été initialement écrit. Plus tard dans le fichier est un endroit plus commode de mettre des choses qui changent plus souvent.C'est dur de manière concise donner de bons conseils sur ce point, car cela dépend vraiment du projet en question. Mais il paye pour savoir comment le construire de mise en cache fonctionne et essayez de profiter de cela.
N' --no-cache invalider et tirez sur la base de l'image si elle a été mis à jour à distance?
OriginalL'auteur