Comment puis-je utiliser une image locale comme image de base avec un dockerfile?

126

Je travaille sur un dockerfile. Je viens de me rendre compte que j'utilise depuis toujours FROMdes images indexées.

Alors je me demande:

  • Comment puis-je utiliser l'une de mes images locales (personnalisées) comme image de base ( FROM) sans pushingcelle-ci dans l'index?
Phil
la source

Réponses:

148

Vous pouvez l'utiliser sans rien faire de spécial. Si vous avez une image locale appelée, blahvous pouvez le faire FROM blah. Si vous le faites FROM blahdans votre Dockerfile, mais ne pas avoir une image locale appelée blah, puis Docker va essayer de tirer à partir du Registre.

En d'autres termes, si un Dockerfile le fait FROM ubuntu, mais que vous avez une image locale appelée ubuntudifférente de l'image officielle, votre image la remplacera.

jpetazzo
la source
5
ne fonctionne pas pour moi - pourrait être un problème avec boot2docker? J'ai la dernière version 1.3.1 ... Docker ne semble pas vérifier localement en premier (ou peut-être ne le signale pas), il tente directement de tirer du registre stackoverflow.com/q/27046118/202168
Anentropic
@Anentropic J'utilise boot2docker 1.5. bash-4.3 $ docker images REPOSITORY TAG IMAGE ID CRÉÉ VIRTUAL SIZE ubuntu1504gcc484 dernier 0378ea1c0b6c il y a 19 heures 1,36 Go Et faire "FROM ubuntu1504gcc484" dans mon autre Dockerfile, et cela fonctionne très bien. (
Toutes mes
Je ne sais plus, je suis aussi maintenant sur 1.5
Anentropic
1
J'ai créé une image et l'ai taguée pour notre registre local. Marqué de cette façon, il ne le trouve pas uniquement avec le nom, et le nom complet inclut le registre, donc si vous faites référence de cette façon, il y récupérera la balise. Vous pouvez le baliser à nouveau avec la forme simple du nom et il le trouvera avant de consulter le registre. A travaillé pour moi.
Gerry Gleason
1
Non, c'est incorrect. Docker tente d'extraire une image d'un registre distant malgré le fait que j'ai une image avec le même nom localement, répertoriée dans docker image list.
John Smith Facultatif
16

Vérifié: cela fonctionne bien dans Docker 1.7.0.

BTW, ne spécifiez pas --pull=truelors de l'exécution de la docker buildcommande:

si vous voulez utiliser l'image locale comme image de base, s'il vous plaît sans l'option --pull=true, --pull=trueessaiera toujours d'extraire une version plus récente de l'image.

- https://github.com/docker/docker/issues/14943

Dmitriusan
la source
4
Si votre image a un -caractère ( my-imagepar exemple) dans le nom, votre docker ne résoudra pas cette image localement, je ne sais pas pourquoi, de toute façon pour la réparer, n'utilisez tout simplement pas de -caractère, testé sur docker-compose 1.8 et docker 1.11
deFreitas
1
Je n'ai eu aucun problème avec un nom avec trait d'union Docker version 17.06.2-ce, build cec0b72, mais assurez-vous que si vous avez tagué votre image, vous incluez la balise dans le cadre de la spécification de l'image (FROM localimage: tag).
Scott
@deFreitas cela semble être vrai, j'ai une image avec des traits d'union dans le nom et Docker essaie de la retirer d'un registre distant malgré une image avec ce nom existant localement. Si cette règle sur les traits d'union dans le nom s'avérait vraie, ce serait de la pure folie.
John Smith Facultatif
@deFreitas: suite à mon dernier commentaire, j'ai essayé avec un trait de soulignement au lieu des traits d'union et j'ai eu le même problème, docker essayant de tirer l'image de la télécommande malgré la présence d'une image locale. Dans mon cas au moins, les tirets ne sont pas le problème.
John Smith Facultatif
4

Vous pouvez avoir - des caractères dans vos images. Supposons que vous ayez une image locale (pas un registre local) nommée centos-base-image avec la balise 7.3.1611.

docker version 
      Client:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4

      Server:
       Version:         1.12.6
       API version:     1.24
       Package version: docker-common-1.12.6-16.el7.centos.x86_64
       Go version:      go1.7.4

docker images
 REPOSITORY            TAG
 centos-base-image     7.3.1611

Dockerfile

FROM centos-base-image:7.3.1611
RUN yum -y install epel-release libaio bc flex

Résultat

Sending build context to Docker daemon 315.9 MB
Step 1 : FROM centos-base-image:7.3.1611
  ---> c4d84e86782e
Step 2 : RUN yum -y install epel-release libaio bc flex
  ---> Running in 36d8abd0dad9
...

Dans l'exemple ci FROM- dessus , vous récupérez votre image locale, vous pouvez fournir des instructions supplémentaires pour récupérer une image de votre registre personnalisé (par exemple FROM localhost:5000/my-image:with.tag). Voir https://docs.docker.com/engine/reference/commandline/pull/#pull-from-a-different-registry et https://docs.docker.com/registry/#tldr

Enfin, si votre image n'est pas résolue lors de la fourniture d'un nom, essayez d' ajouter une balise à l'image lorsque vous la créez

Ce fil de discussion GitHub décrit un problème similaire consistant à ne pas trouver d'images locales par nom .

En omettant une balise spécifique, le docker recherchera une image étiquetée «dernière», donc créez une image avec la balise: latest, ou modifiez votre FROM

steven87vt
la source
0

N'oubliez pas de mettre non seulement la balise mais aussi le référentiel dans lequel se trouve cette balise, de cette façon:

docker images
REPOSITORY                                TAG                       IMAGE ID            CREATED             SIZE
elixir                                    1.7-centos7_3             e15e6bf57262        20 hours ago        925MB

Vous devriez le référencer de cette façon:

elixir:1.7-centos7_3
Rowinson Gallego
la source