Docker
Images de construction
Recherche…
Paramètres
Paramètre | Détails |
---|---|
--tirer | S'assure que l'image de base ( FROM ) est à jour avant de construire le reste du fichier Dockerfile. |
Construire une image à partir d'un fichier Dockerfile
Une fois que vous avez un fichier Docker, vous pouvez créer une image à l'aide de docker build
. La forme de base de cette commande est la suivante:
docker build -t image-name path
Si votre fichier Dockerfile n'est pas nommé Dockerfile
, vous pouvez utiliser l'indicateur -f
pour donner le nom du fichier Dockerfile à générer.
docker build -t image-name -f Dockerfile2 .
Par exemple, pour créer une image nommée dockerbuild-example:1.0.0
partir d'un Dockerfile
dans le répertoire de travail en cours:
$ ls
Dockerfile Dockerfile2
$ docker build -t dockerbuild-example:1.0.0 .
$ docker build -t dockerbuild-example-2:1.0.0 -f Dockerfile2 .
Reportez-vous à la documentation relative à l' utilisation de la docker build
pour plus d'options et de paramètres.
Une erreur courante est de créer un fichier Dockerfile dans le répertoire personnel de l'utilisateur ( ~
). C'est une mauvaise idée car lors de la docker build -t mytag .
ce message apparaîtra longtemps:
Contexte de téléchargement
La cause est le démon docker qui tente de copier tous les fichiers de l'utilisateur (à la fois le répertoire de base et ses sous-répertoires). Évitez cela en spécifiant toujours un répertoire pour le fichier Docker.
L'ajout d'un fichier .dockerignore
répertoire de construction est une bonne pratique . Sa syntaxe est similaire à .gitignore
fichiers .gitignore
et s'assurera que seuls les fichiers et répertoires .gitignore
sont téléchargés en tant que contexte de la génération.
Un simple Dockerfile
FROM node:5
La directive FROM
spécifie une image à partir de laquelle Toute référence d'image valide peut être utilisée.
WORKDIR /usr/src/app
La directive WORKDIR
définit le répertoire de travail actuel dans le conteneur, ce qui équivaut à exécuter cd
dans le conteneur. (Remarque: RUN cd
ne changera pas le répertoire de travail en cours.)
RUN npm install cowsay knock-knock-jokes
RUN
exécute la commande donnée à l'intérieur du conteneur.
COPY cowsay-knockknock.js ./
COPY
copie le fichier ou le répertoire spécifié dans le premier argument à partir du contexte de génération (le path
transmis au docker build path
) vers l'emplacement du conteneur spécifié par le deuxième argument.
CMD node cowsay-knockknock.js
CMD
spécifie une commande à exécuter lorsque l'image est exécutée et qu'aucune commande n'est donnée. Il peut être remplacé en transmettant une commande à docker run
.
Il existe de nombreuses autres instructions et options. voir la référence Dockerfile pour une liste complète.
Différence entre ENTRYPOINT et CMD
Il existe deux directives Dockerfile
pour spécifier quelle commande exécuter par défaut dans les images construites. Si vous spécifiez uniquement CMD
alors docker exécutera cette commande en utilisant le ENTRYPOINT
par défaut, à savoir /bin/sh -c
. Vous pouvez remplacer soit le point d’entrée, soit la commande lorsque vous démarrez l’image construite. Si vous spécifiez les deux, alors ENTRYPOINT
spécifie l'exécutable de votre processus de conteneur et CMD
sera fourni comme paramètre de cet exécutable.
Par exemple, si votre Dockerfile
contient
FROM ubuntu:16.04
CMD ["/bin/date"]
Vous utilisez ensuite la directive ENTRYPOINT
par défaut de /bin/sh -c
et exécutez /bin/date
avec /bin/date
d' /bin/date
par défaut. La commande de votre processus de conteneur sera /bin/sh -c /bin/date
. Une fois que vous exécutez cette image, elle affichera par défaut la date actuelle
$ docker build -t test .
$ docker run test
Tue Jul 19 10:37:43 UTC 2016
Vous pouvez remplacer CMD
sur la ligne de commande, auquel cas il exécutera la commande que vous avez spécifiée.
$ docker run test /bin/hostname
bf0274ec8820
Si vous spécifiez une directive ENTRYPOINT
, Docker utilisera cet exécutable et la directive CMD
spécifie le ou les paramètres par défaut de la commande. Donc, si votre Dockerfile
contient:
FROM ubuntu:16.04
ENTRYPOINT ["/bin/echo"]
CMD ["Hello"]
Alors en courant ça va produire
$ docker build -t test .
$ docker run test
Hello
Vous pouvez fournir différents paramètres si vous le souhaitez, mais ils seront tous exécutés /bin/echo
$ docker run test Hi
Hi
Si vous souhaitez remplacer le point d'entrée répertorié dans votre fichier Docker (par exemple, si vous souhaitez exécuter une commande différente de echo
dans ce conteneur), vous devez spécifier le paramètre --entrypoint
sur la ligne de commande:
$ docker run --entrypoint=/bin/hostname test
b2c70e74df18
Généralement, vous utilisez la directive ENTRYPOINT
pour pointer vers votre application principale que vous souhaitez exécuter et CMD
vers les paramètres par défaut.
Exposer un port dans le fichier Dockerfile
EXPOSE <port> [<port>...]
De la documentation de Docker:
L'instruction
EXPOSE
informe Docker que le conteneur écoute les ports réseau spécifiés au moment de l'exécution.EXPOSE
ne rend pas les ports du conteneur accessibles à l'hôte. Pour ce faire, vous devez utiliser l'-p
pour publier une plage de ports ou l'-P
pour publier tous les ports exposés. Vous pouvez exposer un numéro de port et le publier en externe sous un autre numéro.
Exemple:
À l'intérieur de votre fichier Docker:
EXPOSE 8765
Pour accéder à ce port depuis la machine hôte, incluez cet argument dans votre commande d' docker run
:
-p 8765:8765
ENTRYPOINT et CMD vus sous forme de verbe et de paramètre
Supposons que vous avez un fichier Dockerfile se terminant par
ENTRYPOINT [ "nethogs"] CMD ["wlan0"]
si vous construisez cette image avec un
docker built -t inspector .
lancer l'image construite avec un tel Dockerfile avec une commande telle que
docker run -it --net=host --rm inspector
, nethogs surveillera l'interface nommée wlan0
Maintenant, si vous voulez surveiller l'interface eth0 (ou wlan1, ou ra1 ...), vous ferez quelque chose comme
docker run -it --net=host --rm inspector eth0
ou
docker run -it --net=host --rm inspector wlan1
Pousser et tirer une image vers Docker Hub ou un autre registre
Les images créées localement peuvent être transférées vers Docker Hub ou tout autre hôte repo docker, appelé registre. Utilisez la docker login
au docker login
pour vous connecter à un compte docker hub existant.
docker login
Login with your Docker ID to push and pull images from Docker Hub.
If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: cjsimon
Password:
Login Succeeded
Un registre de docker différent peut être utilisé en spécifiant un nom de serveur. Cela fonctionne également pour les registres privés ou auto-hébergés. De plus, l'utilisation d'un magasin de données d'identification externe pour la sécurité est possible.
docker login quay.io
Vous pouvez ensuite baliser et transférer des images vers le registre auquel vous êtes connecté. Votre référentiel doit être spécifié en tant que server/username/reponame:tag
. Omettre le serveur par défaut est actuellement Docker Hub. (Le registre par défaut ne peut pas être remplacé par un autre fournisseur et il n'est pas prévu de l'implémenter.)
docker tag mynginx quay.io/cjsimon/mynginx:latest
Différentes balises peuvent être utilisées pour représenter différentes versions, ou branches, de la même image. Une image avec plusieurs balises différentes affichera chaque balise dans le même repo.
Utilisez les docker images
pour afficher la liste des images installées sur votre ordinateur local, y compris votre nouvelle image. Puis, appuyez sur pour le télécharger dans le registre et tirez pour télécharger l'image.
docker push quay.io/cjsimon/mynginx:latest
Toutes les balises d'une image peuvent être extraites en spécifiant l'option -a
docker pull quay.io/cjsimon/mynginx:latest
Construire en utilisant un proxy
Souvent , lors de la construction d' une image Docker, le Dockerfile contient des instructions qui exécute des programmes pour aller chercher des ressources de l'Internet ( wget
par exemple pour tirer une version binaire de programme sur GitHub exemple).
Il est possible d'indiquer à Docker de transmettre les variables d'environnement set set afin que ces programmes effectuent ces récupérations via un proxy:
$ docker build --build-arg http_proxy=http://myproxy.example.com:3128 \
--build-arg https_proxy=http://myproxy.example.com:3128 \
--build-arg no_proxy=internal.example.com \
-t test .
build-arg
sont des variables d'environnement disponibles uniquement au moment de la construction.