Traduction japonaise de Référence Dockerfile.
Docker peut créer automatiquement l'image en lisant les instructions du Dockerfile. Dockerfile est un document texte qui décrit les commandes de création d'une image. Appelé et utilisé par l'utilisateur à partir de la ligne de commande. La build docker (https://qiita.com/JhonnyBravo/items/87976fe9de47ed58b8b1) permet aux utilisateurs de créer des builds automatiques qui exécutent successivement plusieurs instructions de ligne de commande.
Cette page décrit les commandes que vous pouvez utiliser dans votre Dockerfile. Après avoir lu cette page, veuillez vous référer aux Meilleures pratiques Dockerfile pour un guide orienté astuces.
La commande docker build crée une image à partir d'un Dockerfile et d'un contexte. Le contexte de construction est un ensemble de fichiers dans le PATH ou l'URL à l'emplacement spécifié. PATH est un répertoire sur votre système de fichiers local. L'URL est l'emplacement du référentiel Git.
Les contextes sont traités de manière récursive. Par conséquent, le PATH contient des sous-répertoires et l'URL contient le référentiel et ses sous-modules. L'exemple suivant montre une commande de construction qui utilise le répertoire actuel comme contexte.
$ docker build .
Sending build context to Docker daemon 6.51 MB
...
La construction est effectuée par le démon Docker, pas par la CLI. La première chose que fait le processus de construction est d'envoyer tout le contexte (récursivement) au démon. Dans la plupart des cas, c'est une bonne idée de commencer avec un répertoire vide comme contexte et de conserver le Dockerfile dans ce répertoire. Ajoutez uniquement les fichiers nécessaires à la création du Dockerfile.
** Avertissement ** N'utilisez pas le répertoire racine `` / '' comme PATH. Tout le contenu du disque dur est transféré vers le démon Docker lors de l'exécution de la compilation.
Lors de l'utilisation d'un fichier dans un contexte de construction, Dockerfile référence le fichier spécifié par une instruction telle que l'instruction COPY ''. Pour améliorer les performances de compilation, ajoutez le fichier
.dockerignoreau répertoire contextuel pour exclure les fichiers et répertoires. Consultez la documentation sur cette page pour savoir comment créer un fichier
.dockerignore``.
Par convention, le Dockerfile est placé à la racine du contexte,
Vous pouvez utiliser l'indicateur -f
dans docker build pour spécifier un Dockerfile
n'importe où dans le système de fichiers. ..
$ docker build -f /path/to/a/Dockerfile .
Vous pouvez spécifier un référentiel et des balises pour enregistrer la nouvelle image si la construction réussit.
$ docker build -t shykes/myapp .
Pour marquer une image dans plusieurs référentiels après la construction, ajoutez plusieurs paramètres `` -t '' lors de l'exécution de la commande de construction.
$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
Le démon Docker effectue une pré-validation du Dockerfile avant d'exécuter les instructions du Dockerfile et renvoie une erreur si la syntaxe est incorrecte.
$ docker build -t test/myapp .
Sending build context to Docker daemon 2.048 kB
Error response from daemon: Unknown instruction: RUNCMD
Le démon Docker exécute les instructions du Dockerfile une par une, valide les résultats de chaque instruction dans une nouvelle image si nécessaire et imprime enfin l'ID de la nouvelle image. Le démon Docker nettoie automatiquement le contexte que vous soumettez.
Notez que chaque instruction est exécutée indépendamment et qu'une nouvelle image est créée. Par conséquent, `` RUN cd / tmp '' n'affecte pas les instructions suivantes.
Dans la mesure du possible, Docker réutilise les images intermédiaires (caches) pour accélérer considérablement le processus de création de Docker. La réutilisation des images intermédiaires est indiquée par le message `ʻUsing cache`` dans la sortie de la console. (Consultez le Guide des meilleures pratiques Dockerfile (https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) pour plus d'informations)
$ docker build -t svendowideit/ambassador .
Sending build context to Docker daemon 15.36 kB
Step 1/4 : FROM alpine:3.2
---> 31f630c65071
Step 2/4 : MAINTAINER [email protected]
---> Using cache
---> 2a1c91448f5f
Step 3/4 : RUN apk update && apk add socat && rm -r /var/cache/
---> Using cache
---> 21ed6e7fbb73
Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh
---> Using cache
---> 7ea8aef582cc
Successfully built 7ea8aef582cc
Le cache de construction n'est utilisé qu'à partir de l'image locale qui a la chaîne parente.
Cela signifie que l'image a été créée par une version précédente ou que toute la chaîne d'images a été chargée avec docker load ''. Si vous souhaitez utiliser le cache de construction pour une image particulière, vous pouvez le spécifier avec l'option
--cache-from ''.
L'image spécifiée par --cache-from
n'a pas besoin d'avoir une chaîne parent et peut être récupérée à partir d'autres registres.
Une fois la construction terminée, vous êtes prêt à réfléchir à la manière de pousser le référentiel vers le registre.
BuildKit
Docker version 18.09 et ultérieure prend en charge un nouveau backend pour exécuter les builds fournis par le projet moby / buildkit. Le backend BuildKit présente de nombreux avantages par rapport aux implémentations plus anciennes. Par exemple, BuildKit peut:
Pour utiliser le backend BuildKit, vous devez définir la variable d'environnement `` DOCKER_BUILDKIT = 1 '' dans la CLI avant d'appeler docker build.
Consultez la documentation du référentiel BuildKit (https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md) pour la syntaxe expérimentale de Dockerfile qui peut être utilisée avec les builds basés sur BuildKit. S'il vous plaît.
Format
Le format du Dockerfile est:
# Comment
INSTRUCTION arguments
Les instructions sont insensibles à la casse. Cependant, il est d'usage de le capitaliser pour le distinguer de ses arguments.
Docker exécute les instructions du Dockerfile dans l'ordre.
Le Dockerfile doit commencer par l'instruction FROM ''. Cela peut être après les directives de l'analyseur, les commentaires et la portée globale «ARG». L'instruction
FROM '' spécifie l'image parente à partir de laquelle elle a été construite.
Le FROM
ne peut être précédé que d'une ou plusieurs instructions ```ARGqui déclarent les arguments utilisés dans la ligne
FROM`` du Dockerfile.
Docker traite les lignes commençant par # '' comme des commentaires, sauf si la ligne est une directive d'analyseur valide. Les marqueurs
# '' ailleurs dans la ligne sont traités comme des arguments.
Cela permet des déclarations telles que:
# Comment
RUN echo 'we are running some # of cool things'
La ligne de commentaire est supprimée avant l'exécution de l'instruction Dockerfile. Autrement dit, les commentaires de l'exemple suivant ne sont pas traités par le shell qui exécute la commande `ʻecho``. Les deux exemples ci-dessous sont équivalents.
RUN echo hello \
# comment
world
RUN echo hello \
world
Les caractères de continuation de ligne ne sont pas pris en charge dans les commentaires.
** Notes sur les blancs **
Pour une compatibilité descendante, les espaces de début avant les commentaires (
# '') et les instructions (telles que
RUN '') sont ignorés, mais pas recommandés. Dans ces cas, les blancs de début ne sont pas conservés, donc l'exemple suivant est équivalent.
# this is a comment-line RUN echo hello RUN echo world
# this is a comment-line RUN echo hello RUN echo world
Cependant, les blancs dans les arguments d'instructions tels que les commandes suivant
RUN '' sont conservés, donc dans l'exemple suivant,
hello world '' est affiché avec un vide au début.
RUN echo "\ hello\ world"
Les directives d'analyseur sont facultatives et affectent la façon dont les lignes suivantes du Dockerfile sont traitées. Les directives d'analyseur n'ajoutent pas de couches à la construction et n'apparaissent pas comme des étapes de construction. Les directives de l'analyseur sont écrites comme un type spécial de commentaire sous la forme `` # directive = valeur ''. Une directive ne peut être utilisée qu'une seule fois.
Lorsqu'un commentaire, une ligne vide ou une instruction de générateur est traitée, Docker ne recherche plus les directives de l'analyseur. Il traite ce qui est écrit comme une directive d'analyseur comme un commentaire et n'essaye pas de vérifier s'il peut s'agir d'une directive d'analyseur. Par conséquent, toutes les directives de l'analyseur doivent être en haut du Dockerfile.
Les directives d'analyseur ne sont pas sensibles à la casse. Cependant, par convention, il devrait être inférieur. Par convention, vous pouvez également inclure une ligne vide après la directive parser. Les caractères de continuation de ligne ne sont pas pris en charge dans les directives d'analyseur.
En raison de ces règles, tous les exemples suivants ne sont pas valides:
Invalide en raison de la continuation de la ligne
# direc \
tive=value
Non valide car il est affiché deux fois
# directive=value1
# directive=value2
FROM ImageName
Il est traité comme un commentaire car il apparaît après les instructions du constructeur.
FROM ImageName
# directive=value
Il est traité comme un commentaire car il apparaît après un commentaire qui n'est pas une directive d'analyseur.
# About my dockerfile
# directive=value
FROM ImageName
`ʻUnknowndirectiveest traité comme un commentaire car il n'est pas reconnu. De plus,
knowndirective '' est traité comme un commentaire car il apparaît après un commentaire qui n'est pas une directive parser.
# unknowndirective=value
# knowndirective=value
La directive parser autorise les espaces sans interruption. Par conséquent, les lignes suivantes sont toutes traitées de la même manière.
#directive=value
# directive =value
# directive= value
# directive = value
# dIrEcTiVe=value
Les directives d'analyseur suivantes sont prises en charge.
syntax
# syntax=[remote image reference]
Exemple
# syntax=docker/dockerfile
# syntax=docker/dockerfile:1.0
# syntax=docker.io/docker/dockerfile:1
# syntax=docker/dockerfile:1.0.0-experimental
# syntax=example.com/user/repo:tag@sha256:abcdef...
Cette fonctionnalité n'est activée que lorsque le backend BuildKit est utilisé.
La directive `` syntax '' définit l'emplacement du générateur Dockerfile utilisé pour construire le Dockerfile actuel. Le backend BuildKit vous permet d'utiliser de manière transparente une implémentation externe du générateur qui est distribuée sous forme d'image Docker et s'exécute dans un environnement de bac à sable de conteneur.
L'implémentation personnalisée de Dockerfile vous permet de:
Docker distribue la version officielle de l'image qui peut être utilisée pour créer un Dockerfile dans le référentiel docker / dockerfile sur DockerHub. Il existe deux canaux où de nouvelles images sont publiées: stable et expérimental.
Les canaux stables suivent le versionnage sémantique.
Exemple:
Le canal expérimental utilise une gestion de version incrémentielle avec des composants majeurs et mineurs du canal stable à la sortie.
Exemple:
Vous devez choisir la chaîne qui correspond à vos besoins. Si vous avez seulement besoin de corriger des bogues, vous devez utiliser docker / dockerfile: 1.0. Si vous souhaitez profiter des fonctionnalités expérimentales, vous devez utiliser le canal expérimental. Si vous utilisez le canal expérimental, nous vous recommandons d'utiliser la variante de version complète immuable, car les nouvelles versions peuvent ne pas être rétrocompatibles.
Voir Description du référentiel source (https://github.com/moby/buildkit/blob/master/README.md) pour les versions principales et les versions de fonctionnalités nocturnes.
escape
# escape=\ (backslash)
Ou
# escape=` (backtick)
Les directives d'échappement définissent les caractères utilisés pour échapper aux caractères dans le Dockerfile. S'il n'est pas spécifié, le caractère d'échappement par défaut est `` \ ''.
Les caractères d'échappement sont utilisés à la fois pour échapper des caractères dans une ligne et pour échapper des sauts de ligne.
Cela permet à l'instruction Dockerfile de s'étendre sur plusieurs lignes.
Notez que l'échappement n'est pas effectué avec la commande RUN
, sauf à la fin de la ligne, indépendamment du fait que la directive parseur ```escape`` soit incluse dans le Dockerfile.
Définir le caractère d'échappement sur "` "est particulièrement utile sous Windows. Ici, `` \ '' est le délimiteur du chemin du répertoire. "` "Est compatible avec Windows PowerShell.
Prenons l'exemple suivant, qui échoue de manière non triviale sous Windows.
Le deuxième \ '' à la fin de la deuxième ligne est interprété comme un échappement de rupture, pas la cible de l'échappement du premier
\ ''.
De même, le `` \ '' à la fin de la troisième ligne est traité comme une continuation de la ligne s'il a été réellement traité comme une instruction.
Le résultat de ce dockerfile est que les deuxième et troisième lignes sont considérées comme une seule instruction.
FROM microsoft/nanoserver
COPY testfile.txt c:\\
RUN dir c:\
Résultat de l'exécution:
PS C:\John> docker build -t cmd .
Sending build context to Docker daemon 3.072 kB
Step 1/2 : FROM microsoft/nanoserver
---> 22738ff49c6d
Step 2/2 : COPY testfile.txt c:\RUN dir c:
GetFileAttributesEx c:RUN: The system cannot find the file specified.
PS C:\John>
L'une des solutions ci-dessus consiste à utiliser / '' comme cible à la fois pour l'instruction
COPY '' et le dir ''. Cependant, cette syntaxe est déroutante car elle n'est pas naturelle dans les chemins Windows. Dans le pire des cas, toutes les commandes Windows ne prennent pas en charge
/ '' comme séparateur de chemin, ce qui le rend sujet aux erreurs.
En ajoutant la directive de l'analyseur `ʻescape``, le Dockerfile suivant réussira comme prévu en utilisant la sémantique naturelle de la plateforme dans le chemin du fichier Windows.
# escape=`
FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\
Résultat de l'exécution:
PS C:\John> docker build -t succeeds --no-cache=true .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM microsoft/nanoserver
---> 22738ff49c6d
Step 2/3 : COPY testfile.txt c:\
---> 96655de338de
Removing intermediate container 4db9acbb1682
Step 3/3 : RUN dir c:\
---> Running in a2c157f842f5
Volume in drive C has no label.
Volume Serial Number is 7E6D-E0F7
Directory of c:\
10/05/2016 05:04 PM 1,894 License.txt
10/05/2016 02:22 PM <DIR> Program Files
10/05/2016 02:14 PM <DIR> Program Files (x86)
10/28/2016 11:18 AM 62 testfile.txt
10/28/2016 11:20 AM <DIR> Users
10/28/2016 11:20 AM <DIR> Windows
2 File(s) 1,956 bytes
4 Dir(s) 21,259,096,064 bytes free
---> 01c7f3bef04f
Removing intermediate container a2c157f842f5
Successfully built 01c7f3bef04f
PS C:\John>
Les variables d'environnement (déclarées dans l'instruction «ENV») peuvent également être utilisées dans certaines instructions comme des variables interprétées par le Dockerfile. Les échappements sont également traités pour inclure une syntaxe de type variable dans l'instruction telle quelle.
Les variables d'environnement sont représentées dans le Dockerfile sous la forme $ variable_name
ou $ {variable_name} ''. Ils sont traités de la même manière et la syntaxe des accolades est généralement utilisée pour résoudre le problème des noms de variables non vides, tels que
$ {foo} _bar``.
La syntaxe `` $ {variable_name} '' prend également en charge certains des modificateurs bash standard spécifiés ci-dessous.
$ {variable: -word} '' indique que si une variable est définie, le résultat sera cette valeur. Si la variable n'est pas définie,
mot '' sera le résultat.$ {variable: + mot} '' indique que
mot '' sera généré si la variable est définie, sinon le résultat sera une chaîne vide.Dans tous les cas, `` mot '' peut être n'importe quelle chaîne contenant des variables d'environnement supplémentaires.
L'échappement est possible en ajoutant \ '' à la variable. Par exemple,
\ $ fooou
\ $ {foo} '' est converti en $ foo
et `` $ {foo} ''.
Exemple (la représentation analysée apparaît après `` # ''):
FROM busybox
ENV FOO=/bar
WORKDIR ${FOO} # WORKDIR /bar
ADD . $FOO # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux
Les variables d'environnement sont prises en charge par les instructions ci-dessous dans le Dockerfile.
Lors du remplacement des variables d'environnement, la même valeur est utilisée pour chaque variable tout au long de l'instruction. En d'autres termes, dans cet exemple:
ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc
Le résultat est un def '' avec une valeur de
bonjour '' au lieu d'un bye ''. Cependant,
ghi ne fait pas partie de la même instruction qui définit ```abc
sur bye
, donc il a une valeur de bye
.
La CLI du docker recherche un fichier nommé .dockerignore
dans le répertoire racine du contexte avant d'envoyer le contexte au démon docker.
Si ce fichier existe, la CLI modifie le contexte pour exclure les fichiers et les répertoires qui correspondent au modèle qu'il contient.
Cela évite d'envoyer inutilement des fichiers ou des répertoires volumineux ou sensibles au démon ou de les ajouter à l'image en utilisant «ADD» ou «COPY».
La CLI interprète le fichier .dockerignore
comme une liste de motifs séparés par des sauts de ligne similaires aux gants de fichiers shell Unix.
À des fins de classement, la racine du contexte est considérée à la fois comme le répertoire de travail et le répertoire racine.
Par exemple, les modèles / foo / bar
et foo / bar
sont tous deux bar '' à la racine du dépôt git dans le sous-répertoire
foo '' de `` PATH '' ou à l'URL. Excluez les fichiers ou répertoires nommés `.
Ni l'un ni l'autre n'exclut l'autre.
Si une ligne du fichier .dockerignore
commence par `` # '' dans la première colonne, cette ligne est considérée comme un commentaire et est ignorée avant d'être interprétée par la CLI.
Voici un exemple d'écriture d'un fichier .dockerignore
:
# comment
*/temp*
*/*/temp*
temp?
Ce fichier provoque le comportement de génération suivant:
règle | mouvement |
---|---|
# comment |
Ignorez-le. |
*/temp* |
Un sous-répertoire direct de la racine, nommétemp Excluez les fichiers et répertoires commençant par. Par exemple, un fichier brut/somedir/temporary.txt Est exclu et le répertoire/somedir/temp Est également exclu. |
*/*/temp* |
Depuis un sous-répertoire deux niveaux sous la racinetemp Excluez les fichiers et répertoires commençant par. Par exemple/somedir/subdir/temporary.txt Est exclu. |
temp? |
Le nom est temp+Exclut les fichiers et répertoires du répertoire racine contenant un seul caractère. Par exemple/tempa Quand/tempb Est exclu. |
La correspondance est effectuée à l'aide de la règle filepath.Match '' de Go. L'étape de pré-traitement utilise
filepath.Clean '' de Go pour supprimer les espaces blancs de début et de fin, et supprime les éléments . '' Et
.. ''.
Les lignes vides sont ignorées après le prétraitement.
En plus de la règle filepath.Match '' de Go, Docker prend également en charge la chaîne générique spéciale
** '' qui correspond à n'importe quel nombre de répertoires (y compris les zéros).
Par exemple, ** / *. Go
exclut tous les fichiers se terminant par .go
dans tous les répertoires contenant la racine du contexte de construction.
Vous pouvez créer des exceptions d'exclusion en utilisant des lignes commençant par ! '' (Exclamation). Voici un exemple de fichier
.dockerignore`` utilisant ce mécanisme.
*.md
!README.md
Tous les fichiers markdown sauf README.md
sont exclus du contexte.
Le placement de la règle d'exception ! '' Affecte son comportement. La dernière ligne de
.dockerignore`` qui correspond à un fichier particulier détermine si ce fichier est inclus ou exclu.
Prenons l'exemple suivant.
*.md
!README*.md
README-secret.md
Les fichiers Markdown ne sont pas inclus dans le contexte, à l'exception des fichiers README '' autres que
README-secret.md``.
Considérons maintenant cet exemple.
*.md
README-secret.md
!README*.md
Contient tous les fichiers README ''. La ligne médiane n'a aucun effet car
! README * .mdcorrespond à
README-secret.md`` et vient à la fin.
Vous pouvez également utiliser le fichier .dockerignore '' pour exclure les fichiers Dockerfile et
.dockerignore``.
Ces fichiers continueront d'être envoyés au démon car ils doivent exécuter le travail.
Cependant, les instructions «ADD» et «COPY» ne les copient pas sur l'image.
Enfin, il est judicieux de spécifier les fichiers que vous souhaitez inclure dans le contexte, et non les fichiers que vous souhaitez exclure.
Pour ce faire, spécifiez * '' comme premier motif, suivi d'un ou plusieurs motifs d'exception
! ''.
** Attention **
Pour des raisons historiques, le motif ``. '' Est ignoré.
FROM
FROM [--platform=<platform>] <image> [AS <name>]
Ou
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
Ou
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]
L'instruction FROM '' initialise une nouvelle étape de construction et définit l'image de base pour les instructions suivantes. Par conséquent, un Dockerfile valide doit commencer par l'instruction
FROM ''.
L'image peut être n'importe quelle image valide.
Il est particulièrement facile de commencer par obtenir l'image à partir d'un référentiel public.
et
FROM`` (Comprendre l'interaction entre # arg- et -from-).FROM '' peut apparaître plusieurs fois dans un seul Dockerfile pour créer plusieurs images ou utiliser une étape de construction comme dépendance d'une autre. Notez simplement la dernière sortie d'ID d'image par
commit '' avant la nouvelle instruction FROM ''. Chaque instruction
FROM '' efface tous les états créés par l'instruction précédente.à l'instruction
FROM. Ce nom peut être utilisé dans les instructions suivantes
FROM '' et `` COPY --from = Vous pouvez utiliser l'indicateur optionnel --platform
pour spécifier la plate-forme de l'image lorsque FROM '' fait référence à une image multi-plate-forme. Par exemple,
linux / amd64 '', linux / arm64 '' ou
windows / amd64 ''.
Par défaut, la plate-forme cible de la demande de génération est utilisée.
Vous pouvez utiliser des arguments de construction globaux pour la valeur de cet indicateur.
Par exemple, vous pouvez utiliser l'argument de plate-forme automatique pour forcer une étape vers une plate-forme de construction native et l'utiliser pour effectuer une compilation croisée vers une plate-forme cible dans l'étape.
( --platform=$BUILDPLATFORM
)
et
FROM``L'instruction FROM
prend en charge les variables déclarées par l'instruction ```ARGqui se produit avant le premier
FROM``.
ARG CODE_VERSION=latest
FROM base:${CODE_VERSION}
CMD /code/run-app
FROM extras:${CODE_VERSION}
CMD /code/run-extras
```ARGdéclaré avant
FROMest en dehors de la phase de construction et ne peut pas être utilisé dans les instructions après
FROM``.
Pour utiliser la valeur par défaut de «ARG» déclarée avant le premier «FROM», utilisez l'instruction «ARG» sans valeur à l'étape de construction.
ARG VERSION=latest
FROM busybox:$VERSION
ARG VERSION
RUN echo $VERSION > image_version
RUN
RUN
a deux formes:
RUN <command> '' (format shell. Les commandes sont exécutées sur le shell. Le shell par défaut pour Linux est
/ bin / sh -c ''.
Le shell par défaut pour Windows est `` cmd / S / C ''RUN ["exécutable", "param1", "param2"]
(format `ʻexec``)L'instruction `` RUN '' exécute la commande sur un nouveau calque sur l'image courante et valide le résultat. L'image avec le résultat validé sera utilisée à l'étape suivante dans le Dockerfile.
Hiérarchiser l'instruction `` RUN '' et générer des commits est conforme au concept de base de Docker de commits bon marché et à la possibilité de créer des conteneurs à partir de n'importe quel point de l'historique de l'image, comme le contrôle de code source.
Vous pouvez utiliser le format ```execpour éviter de changer la chaîne du shell ou pour exécuter la commande
RUN`` avec une image de base qui ne contient pas l'exécutable shell spécifié.
Le shell au format shell par défaut peut être modifié à l'aide de la commande `` SHELL ''.
Sous forme de shell, vous pouvez utiliser \ '' (barre oblique inverse) pour continuer une seule instruction
RUN '' sur la ligne suivante.
Par exemple, considérez les deux lignes suivantes:
RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
Ensemble, ils correspondent à la ligne suivante:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
Pour utiliser un autre shell autre que / bin / sh
, utilisez le format `ʻexec``, qui passe le shell souhaité. Par exemple:
RUN ["/bin/bash", "-c", "echo hello"]
** Attention **
Le format> `ʻexec`` est analysé comme un tableau JSON.
Autrement dit, vous devez utiliser des guillemets doubles (`` "
) avant et après le mot, pas des guillemets simples (
'
).
Contrairement à la forme shell, la forme ʻexec`` n'appelle pas la commande shell. Cela signifie que le traitement normal du shell ne se produira pas. Par exemple, `` RUN ["echo", "$ HOME"] `` ne fait pas de substitution de variable pour `` $ HOME``. Si un shelling est nécessaire, utilisez le format shell ou exécutez directement le shell. Exemple: `` RUN ["sh", "-c", "echo $ HOME"] ``. Si vous exécutez directement le shell en utilisant le format
ʻexec``, comme dans le format shell, c'est le shell, et non le Docker, qui étend les variables d'environnement.
** Attention **
Au format JSON, les contre-obliques doivent être échappées. Ceci est particulièrement pertinent pour Windows, où la barre oblique inverse est le séparateur de chemin. La ligne suivante est traitée comme un format shell car ce n'est pas un JSON valide et échoue de manière inattendue:
RUN ["c:\windows\system32\tasklist.exe"]
La syntaxe correcte pour cet exemple est:
RUN ["c:\\windows\\system32\\tasklist.exe"]
Le cache des instructions RUN '' n'est pas automatiquement désactivé lors de la prochaine construction. Le cache d'instructions comme
RUN apt-get dist-upgrade -y '' sera réutilisé dans la prochaine version.
Le cache d'instructions RUN '' peut être désactivé à l'aide de l'indicateur
--no-cache(par exemple,
docker build --no-cache '').
Consultez le Guide des meilleures pratiques Dockerfile (https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/) pour plus d'informations.
Le cache de l'instruction RUN
peut être écrasé par les instructions ```ADDet
COPY``.
rm '' un fichier. Sur les systèmes avec des versions aufs récentes (c'est-à-dire que vous pouvez définir l'option de montage
dirperm1), docker essaiera automatiquement de résoudre le problème en montant la couche à l'aide de l'option
diperm1 ''. ..
Consultez la page de manuel aufs (https://github.com/sfjro/aufs3-linux/tree/aufs3.18/Documentation/filesystems/aufs) pour plus d'informations sur l'option diperm1 ''. Si votre système ne prend pas en charge
dirperm1 '', le problème 783 (https://github.com/docker/docker/issues/783) fournit une solution de contournement.CMD
L'instruction `` CMD '' a trois formes:
CMD ["executable", "param1", "param2"]
(format `ʻexec``. C'est le format recommandé)CMD ["param1", "param2"]
(Utilisé comme paramètre par défaut pour ```ENTRYPOINT``)Il ne peut y avoir qu'une seule instruction CMD '' dans un Dockerfile. Si vous listez plusieurs
CMD '', seul le dernier `` CMD '' sera valide.
L'objectif principal de CMD '' est de fournir un comportement par défaut pour l'exécution des conteneurs. Ces comportements par défaut peuvent inclure «exécutable» ou omettre «exécutable». Si vous omettez `ʻexecutable
, vous devez également spécifier l'instruction` ʻENTRYPOINT``.
Si vous utilisez CMD
pour fournir les arguments par défaut pour l'instruction ENTRYPOINT``, vous devez spécifier à la fois les instructions `` CMD`` et
ENTRYPOINT`` au format tableau JSON. ..
** Attention **
Le format> `ʻexec`` est analysé comme un tableau JSON.
Autrement dit, vous devez utiliser des guillemets doubles (`` "
) avant et après le mot, pas des guillemets simples (
'
).
Contrairement à la forme shell, la forme ʻexec`` n'appelle pas la commande shell. Cela signifie que le traitement normal du shell ne se produira pas. Par exemple, `` CMD ["echo", "$ HOME"] `` ne fait pas de substitution de variable avec `` $ HOME``. Si un shelling est nécessaire, utilisez le format shell ou exécutez directement le shell. Exemple: `` CMD ["sh", "-c", "echo $ HOME"] `` Si vous exécutez directement le shell en utilisant le format
ʻexec``, comme dans le format shell, c'est le shell, et non le Docker, qui étend les variables d'environnement.
Lorsqu'elle est utilisée au format shell ou ```exec, l'instruction
CMD`` définit la commande à exécuter lors de l'exécution de l'image.
Lors de l'utilisation de la forme shell de CMD
, <command> '' est exécuté avec
/ bin / sh -c '':
FROM ubuntu
CMD echo "This is a test." | wc -
Si vous voulez exécuter <commande>
sans shell, vous devez représenter la commande sous forme de tableau JSON et spécifier le chemin complet vers ```executable. Ce format de tableau est le format recommandé pour
CMD ''.
Les paramètres supplémentaires doivent être représentés individuellement sous forme de chaînes dans le tableau.
FROM ubuntu
CMD ["/usr/bin/wc","--help"]
Si vous voulez que le conteneur exécute le même ʻexécutable`` à chaque fois, vous devriez envisager d'utiliser
ʻENTRYPOINT en combinaison avec` `CMD
.
Voir `ʻENTRYPOINT``.
Si l'utilisateur spécifie un argument pour l'exécution du docker (https://qiita.com/JhonnyBravo/items/eee5a91682f1d7c72f6e), la valeur par défaut spécifiée par `` CMD '' sera remplacée.
** Attention **
Ne confondez pas
RUN '' avec
CMD ''.RUN '' exécute réellement la commande et valide le résultat.
CMD '' ne fait rien au moment de la construction, mais spécifie la commande que vous voulez que l'image exécute.
LABEL
LABEL <key>=<value> <key>=<value> <key>=<value> ...
L'instruction LABEL '' ajoute des métadonnées à l'image.
LABEL '' est une paire clé / valeur.
Pour inclure des espaces dans la valeur de `` LABEL '', utilisez des guillemets et des barres obliques inverses comme vous le feriez pour l'analyse de la ligne de commande.
Exemple d'utilisation:
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
Les images peuvent avoir plusieurs étiquettes. Vous pouvez spécifier plusieurs étiquettes sur une ligne. Avant Docker 1.10, cela réduisait la taille de l'image finale, ce qui n'est plus le cas. Vous pouvez également spécifier plusieurs étiquettes avec une seule instruction de l'une des deux manières suivantes:
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"
Les étiquettes contenues dans l'image de base ou l'image parente (l'image de la ligne `` FROM '') sont héritées par l'image enfant. Si l'étiquette existe déjà mais que les valeurs sont différentes, la dernière valeur appliquée écrase la valeur précédemment définie.
Utilisez la commande docker image inspect '' pour afficher l'étiquette de l'image. Seules les étiquettes peuvent être affichées à l'aide de l'option
--format ''.
docker image inspect --format='' myimage
{
"com.example.vendor": "ACME Incorporated",
"com.example.label-with-value": "foo",
"version": "1.0",
"description": "This text illustrates that label-values can span multiple lines.",
"multi.label1": "value1",
"multi.label2": "value2",
"other": "value3"
}
MAINTAINER <name>
L'instruction MAINTAINER
définit le champ ```Authordans l'image générée. L'instruction
LABEL '' vous donne beaucoup plus de flexibilité que le MAINTAINER '' pour définir les métadonnées requises. Utilisez plutôt
LABEL ''.
Vous pouvez facilement le visualiser en utilisant, par exemple, docker inspect ''. Pour définir le libellé correspondant au champ
MAINTAINER '':
LABEL maintainer="[email protected]"
Ceci est affiché à partir de `` docker inspect '' avec d'autres étiquettes.
EXPOSE
EXPOSE <port> [<port>/<protocol>...]
L'instruction «EXPOSE» notifie à Docker qu'il écoutera sur le port réseau spécifié lors de l'exécution du conteneur. Vous pouvez spécifier si le port écoute sur TCP ou UDP. Si aucun protocole n'est spécifié, la valeur par défaut est TCP.
L'instruction «EXPOSE» n'expose pas réellement le port.
Il agit comme une sorte de document entre la personne qui crée l'image et la personne qui gère le conteneur, et est destiné à exposer le port.
Pour exposer réellement les ports lorsque le conteneur s'exécute, utilisez l'indicateur -p
dans docker run pour créer un ou plusieurs ports Publiez et associez, ou utilisez l'indicateur `` -P '' pour exposer tous les ports exposés et les lier à des ports supérieurs.
Par défaut, «EXPOSE» suppose TCP, Vous pouvez également spécifier UDP.
EXPOSE 80/udp
Pour publier à la fois en TCP et UDP, écrivez les deux lignes suivantes:
EXPOSE 80/tcp
EXPOSE 80/udp
Dans ce cas, l'utilisation de -P
dans docker run expose le port une fois pour TCP et une fois pour UDP.
Notez que `` -P '' utilise un port d'hôte supérieur temporaire sur l'hôte, donc les ports ne sont pas les mêmes pour TCP et UDP.
Vous pouvez les remplacer lors de l'exécution en utilisant l'indicateur -p
quel que soit le paramètre `ʻEXPOSE``.
Exemple:
docker run -p 80:80/tcp -p 80:80/udp ...
Voir Utilisation de l'indicateur -P '' pour configurer la redirection de port sur le système hôte. La commande
docker network '' prend en charge la création d'un réseau pour la communication entre conteneurs sans avoir à exposer ou publier un port spécifique.
En effet, les conteneurs connectés au réseau peuvent communiquer entre eux via n'importe quel port.
Pour plus d'informations, consultez «Présentation des fonctionnalités du réseau docker» (https://docs.docker.com/engine/userguide/networking/).
ENV
ENV <key>=<value> ...
L'instruction ʻENV`` définit la variable d'environnement
<key>
sur la valeur
<value>
`.
Cette valeur se trouve dans l'environnement de toutes les instructions ultérieures de l'étape de construction et peut souvent être remplacée en ligne.
La valeur est interprétée pour d'autres variables d'environnement et sera supprimée si les guillemets ne sont pas échappés.
Comme pour l'analyse de ligne de commande, vous pouvez utiliser des guillemets et des barres obliques inverses pour inclure des espaces dans la valeur.
Exemple:
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
L'instruction ʻENV`` vous permet de définir plusieurs variables
<key> = <valeur> ...
`à la fois.
Dans l'exemple ci-dessous, l'image finale donnera le même résultat final.
ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
MY_CAT=fluffy
Les variables d'environnement définies à l'aide de «ENV» sont conservées lorsque le conteneur est exécuté à partir de l'image résultante.
Vous pouvez utiliser docker inspect '' pour afficher la valeur et utiliser
docker run --env
La persistance des variables d'environnement peut provoquer des effets secondaires inattendus. Par exemple, définir «ENV DEBIAN_FRONTEND = noninteractive» change le comportement de «apt-get» et peut dérouter les utilisateurs de l'image.
Si les variables d'environnement ne sont nécessaires que pendant la génération et non dans l'image finale, envisagez de définir la valeur pour une seule commande à la place.
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
Ou utilisez «ARG» qui n'est pas conservé dans l'image finale.
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...
** Notation alternative **
L'instruction> ʻENV`` peut utiliser la syntaxe alternative
ʻENV
et omettre
.
Exemple:
ENV MY_VAR my-value
Cette syntaxe ne permet pas de définir plusieurs variables d'environnement dans une seule instruction «ENV», ce qui peut prêter à confusion. Définissez une seule variable d'environnement
ʻONE`` avec la valeur
" TWO = THREE = world "
`, par exemple:ENV ONE TWO= THREE=world
Une autre syntaxe est prise en charge pour la compatibilité descendante, mais elle est obsolète pour les raisons mentionnées ci-dessus et peut être supprimée dans une version ultérieure.
ADD
«ADD» a deux formes:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
Les chemins contenant des espaces nécessitent cette dernière forme.
** Attention **
La fonctionnalité
--chown '' n'est prise en charge que dans le Dockerfile utilisé pour construire le conteneur Linux, pas dans le conteneur Windows. Le concept de propriété des utilisateurs et des groupes n'étant pas traduit entre Linux et Windows, utilisez
/ etc / passwd '' et `` / etc / group '' pour convertir les noms d'utilisateurs et de groupes en ID. Lorsqu'elle est utilisée, cette fonctionnalité est limitée à viable uniquement s'il s'agit d'un conteneur basé sur un système d'exploitation Linux.
L'instruction ʻADD`` copie l'URL d'un nouveau fichier, répertoire ou fichier distant à partir de
<src> '' et l'ajoute au système de fichiers de l'image avec le chemin
`
Vous pouvez spécifier plusieurs ressources ``
Chaque <src> '' peut contenir des caractères génériques et la correspondance est effectuée à l'aide de la règle
filepath.Match '' de Go.
Par exemple, pour ajouter tous les fichiers commençant par `` hom '':
ADD hom* /mydir/
Dans l'exemple ci-dessous, ? '' Est remplacé par un seul caractère, tel que
home.txt ''.
ADD hom?.txt /mydir/
<dest> '' est un chemin absolu ou un chemin relatif comme vu de
WORKDIR``, et la source est copiée dans le conteneur de destination.
L'exemple suivant utilise un chemin relatif pour ajouter test.txt
à <WORKDIR> / relativeDir /
:
ADD test.txt relativeDir/
Cet exemple utilise un chemin absolu pour ajouter test.txt
à `` / abstractDir / ''.
ADD test.txt /absoluteDir/
Si vous ajoutez des fichiers ou des répertoires contenant des caractères spéciaux (tels que ['' ou
] ), vous devez échapper à ces chemins selon les règles de langue de Go afin qu'ils ne soient pas traités comme des modèles correspondants. Il y a. Par exemple, pour ajouter un fichier nommé `ʻarr [0] .txt
, utilisez:
ADD arr[[]0].txt /mydir/
Avec tous les nouveaux fichiers, sauf si l'indicateur facultatif --chown '' spécifie un nom d'utilisateur, un nom de groupe ou une combinaison UID / GID spécifique pour revendiquer la propriété spécifique du contenu ajouté Le répertoire est créé avec un UID et un GID de 0. Sous la forme de l'indicateur
--chown '', vous pouvez utiliser n'importe quelle combinaison de chaînes de nom d'utilisateur et de nom de groupe, ou des entiers directs UID et GID.
Si vous spécifiez un nom d'utilisateur sans nom de groupe ou un UID sans GID, le même UID numérique que le GID est utilisé.
Si un nom d'utilisateur ou de groupe est spécifié, utilisez les fichiers / etc / passwd '' et
/ etc / group '' du système de fichiers racine du conteneur pour passer du nom à l'UID ou GID entier. Chaque conversion est effectuée.
L'exemple suivant montre une définition valide de l'indicateur --chown
.
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
Si le système de fichiers racine du conteneur ne contient pas de fichier / etc / passwd
ou / etc / group
et que le nom d'utilisateur ou le nom de groupe est utilisé avec l'indicateur --chown
, L'opération ```ADD`` provoque l'échec de la construction.
L'utilisation d'ID numériques ne nécessite pas de recherche et est indépendante du contenu du système de fichiers racine du conteneur.
Si <src> '' est l'URL d'un fichier distant, la destination dispose de 600 autorisations. Si le fichier distant que vous obtenez a un en-tête HTTP Last-Modified, utilisez l'horodatage dans cet en-tête pour définir le mtime pour le fichier de destination. Cependant, comme tout autre fichier traité pendant `ʻADD
, mtime n'est pas inclus dans la détermination si un fichier a changé et le cache doit être mis à jour.
** Attention **
Si vous passez un Dockerfile à
STDIN
(docker build- <somefile
) pour construire, le Dockerfile ne peut contenir que des instructionsADD
basées sur l'URL car il n'y a pas de contexte de construction. Je vais. Vous pouvez également transmettre l'archive compressée viaSTDIN '': (
docker build- <archive.tar.gz``). Le Dockerfile à la racine de l'archive et le reste de l'archive seront utilisés comme contexte de construction.
Si le fichier URL est protégé en utilisant l'authentification, alors l'instruction ʻADD`` ne prend pas en charge l'authentification, alors utilisez
RUN wget``,
`RUN curl``, ou depuis le conteneur. Vous devez utiliser un autre outil.
** Attention **
La première instruction
ADD
détectée invalide le cache de toutes les instructions suivantes du Dockerfile si le contenu de<src>
est modifié. Cela inclut la désactivation du cache de l'instruction `` RUN ''. Pour plus d'informations, consultez le Guide des meilleures pratiques Dockerfile - Exploiter le cache de build (https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cache).
«ADD» suit les règles ci-dessous.
<src> '' est l'URL et
<src>
est une URL et <dest> '' se termine par une barre oblique à la fin, le nom du fichier est déduit de l'URL et le fichier est
ʻADD http: // example.com / foobar /
crée le fichier
`/ foobar. Dans ce cas, l'URL doit avoir un chemin important pour pouvoir trouver le nom de fichier correct (
http: // example.com`` ne fonctionne pas).** Attention **
Le répertoire lui-même n'est pas copié, seul son contenu est copié.
<src> '' est une archive tar locale dans un format de compression reconnu (
gzip '', bzip2 '' ou
xz ''), elle sera décompressée en tant que répertoire.
Les ressources des URL distantes ne sont pas décompressées.
Lorsque le répertoire est copié ou décompressé, il se comporte de la même manière que `` tar -x '', et le résultat est la somme suivante.** Attention **
Le fait qu'un fichier soit identifié comme un format de compression reconnu dépend uniquement du contenu du fichier, et non du nom du fichier. Par exemple, si un fichier vide se termine par
.tar.gz
, il ne sera pas reconnu comme un fichier compressé, aucun message d'erreur de décompression ne sera généré, et le fichier sera simplement copié vers la destination.
<src> '' est un autre type de fichier, il sera copié séparément avec les métadonnées. Dans ce cas, si
/ '' à la fin, il est considéré comme un répertoire, et le contenu de
<dest> / base (<src>. )
Écrit à.<src> '' sont spécifiées, soit directement, soit en utilisant des caractères génériques,
<dest> '' ne se termine pas par une barre oblique à la fin, il est considéré comme un fichier normal et le contenu de
COPY
`` COPY '' a deux formes:
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
Cette dernière forme est requise pour les chemins contenant des espaces.
** Attention **
La fonctionnalité
--chown '' n'est prise en charge que dans le Dockerfile utilisé pour construire le conteneur Linux, pas dans le conteneur Windows. Puisque le concept de propriété des utilisateurs et des groupes n'est pas traduit entre Linux et Windows, utilisez
/ etc / passwd '' et `` / etc / group '' pour convertir les noms d'utilisateurs et de groupes en ID. Utiliser. Cette fonctionnalité est limitée à l'exécutable uniquement s'il s'agit d'un conteneur basé sur un système d'exploitation Linux.
L'instruction COPY '' copie un nouveau fichier ou répertoire de
Vous pouvez spécifier plusieurs ressources ``
Chaque <src> '' peut contenir des caractères génériques et la correspondance est effectuée à l'aide de la règle
filepath.Match '' de Go.
Par exemple, pour ajouter tous les fichiers commençant par `` hom '':
COPY hom* /mydir/
Dans l'exemple ci-dessous, ? '' Est remplacé par un seul caractère, tel que
home.txt ''.
COPY hom?.txt /mydir/
<dest> '' est un chemin absolu, ou un chemin relatif à
WORKDIR '', et la source est copiée dans le conteneur de destination.
L'exemple suivant utilise un chemin relatif pour ajouter test.txt
à ``
COPY test.txt relativeDir/
Cet exemple utilise un chemin absolu pour ajouter test.txt
à `` / abstractDir / ''.
COPY test.txt /absoluteDir/
Lors de la copie de fichiers ou de répertoires contenant des caractères spéciaux (tels que ['' ou
] ), échappez à ces chemins selon les règles de langue de Go afin qu'ils ne soient pas traités comme des modèles correspondants. est nécessaire. Par exemple, pour copier un fichier nommé `ʻarr [0] .txt
, utilisez:
COPY arr[[]0].txt /mydir/
Avec tous les nouveaux fichiers, sauf si l'indicateur facultatif --chown '' spécifie un nom d'utilisateur, un nom de groupe ou une combinaison UID / GID spécifique pour revendiquer la propriété spécifique du contenu copié. Le répertoire est créé avec un UID et un GID de 0. Sous la forme de l'indicateur
--chown '', vous pouvez utiliser n'importe quelle combinaison de chaînes de nom d'utilisateur et de nom de groupe, ou des entiers directs UID et GID.
Si vous spécifiez un nom d'utilisateur sans nom de groupe ou un UID sans GID, le même UID numérique que le GID est utilisé.
Si un nom d'utilisateur ou de groupe est spécifié, utilisez les fichiers / etc / passwd '' et
/ etc / group '' du système de fichiers racine du conteneur pour passer du nom à l'UID ou GID entier. Chaque conversion est effectuée.
L'exemple suivant montre une définition valide de l'indicateur --chown
.
COPY --chown=55:mygroup files* /somedir/
COPY --chown=bin files* /somedir/
COPY --chown=1 files* /somedir/
COPY --chown=10:11 files* /somedir/
Le système de fichiers racine du conteneur ne contient pas de fichier / etc / passwd
ou / etc / group
et le nom d'utilisateur ou le nom de groupe est utilisé avec l'indicateur --chown
Si tel est le cas, la construction échouera avec l'opération `` COPY ''.
L'utilisation d'ID numériques ne nécessite pas de recherche et est indépendante du contenu du système de fichiers racine du conteneur.
** Attention **
Si vous construisez en utilisant
STDIN '' (
docker build- <somefile ''), vous ne pouvez pas utiliser `` COPY '' car il n'y a pas de contexte de construction.
Facultativement, COPY '' est un drapeau
--from =
`` COPY '' suit les règles suivantes:
<src> '' doit être dans le contexte de la construction. Vous ne pouvez pas
COPY ../quelque chose / quelque chosecar la première étape de
dockerbuild`` est d'envoyer le répertoire contextuel (et les sous-répertoires) au démon docker.** Attention **
Le répertoire lui-même n'est pas copié, seul son contenu est copié.
<src> '' est un type de fichier autre qu'un répertoire, il sera copié séparément avec les métadonnées. Dans ce cas, si
/ '' à la fin, il est considéré comme un répertoire, et le contenu de
<dest> / base (<src>. )
Écrit à.<src> '' sont spécifiées, soit directement, soit en utilisant des caractères génériques,
<dest> '' ne se termine pas par une barre oblique à la fin, il est considéré comme un fichier normal et le contenu de
** Attention **
La première instruction
COPY '' détectée invalide le cache de toutes les instructions suivantes du Dockerfile si le contenu de
'' est modifié. Cela inclut la désactivation du cache de l'instruction `` RUN ''. Pour plus d'informations, consultez le Guide des meilleures pratiques Dockerfile - Exploiter le cache de build (https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#leverage-build-cache).
ENTRYPOINT
`ʻENTRYPOINT`` a deux formes:
Le format recommandé est le format «exec»:
ENTRYPOINT ["executable", "param1", "param2"]
Format de la coque:
ENTRYPOINT command param1 param2
Vous pouvez utiliser ʻENTRYPOINT`` pour configurer le conteneur dans lequel
ʻexecutable`` est exécuté.
Par exemple, l'exemple suivant démarre nginx avec le contenu par défaut et écoute sur le port 80.
$ docker run -i -t --rm -p 80:80 nginx
Les arguments de ligne de commande à docker run <image> '' sont ajoutés après tous les éléments du format `ʻexec````ENTRYPOINT
et tous les éléments spécifiés à l'aide de
CMDÉcraser. Cela vous permet de transmettre des arguments au point d'entrée. Autrement dit,
docker run transmet l'argument
-d au point d'entrée. Vous pouvez remplacer l'instruction `ʻENTRYPOINT
avec l'indicateur
docker run --entrypoint``.
La forme shell n'utilise plus CMD
ou l'exécution d'arguments de ligne de commande, mais a l'inconvénient que ```ENTRYPOINTest démarré comme une sous-commande de
/ bin / sh -c qui ne transmet pas de signal. il y a. Cela signifie que «exécutable» ne reçoit pas le PID 1 pour le conteneur et ne reçoit pas de signal Unix. Par conséquent, `ʻexecutable
ne reçoit pas
SIGTERM`` de
docker stop
.
Seule la dernière instruction `ʻENTRYPOINT`` du Dockerfile est valide.
Peut être modifié en utilisant l'une ou l'autre forme de CMD
après avoir défini des commandes et des arguments par défaut assez stables en utilisant ʻENTRYPOINT`` sous la forme
ʻexec`` Vous pouvez définir des comportements par défaut supplémentaires qui sont plus probables.
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
Lorsque vous exécutez le conteneur, vous pouvez voir que `` top '' est le seul processus.
$ docker run -it --rm --name test top -H
top - 08:25:00 up 7:27, 0 users, load average: 0.00, 0.01, 0.05
Threads: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 2056668 total, 1616832 used, 439836 free, 99352 buffers
KiB Swap: 1441840 total, 0 used, 1441840 free. 1324440 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19744 2336 2080 R 0.0 0.1 0:00.04 top
Vous pouvez utiliser `` docker exec '' pour examiner les résultats plus en détail.
$ docker exec -it test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H
root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux
Vous pouvez également utiliser le test d'arrêt de docker '' pour demander que
top '' soit arrêté correctement.
Le Dockerfile suivant montre comment exécuter Apache au premier plan (c'est-à-dire comme PID 1) en utilisant `ʻENTRYPOINT``.
FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
Si vous avez besoin de créer un seul script de démarrage ʻexecutable``, utilisez les commandes
ʻexec et` `gosu
pour vous assurer que le dernier` ʻexécutable`` reçoit le signal Unix. Vous pouvez le faire.
#!/usr/bin/env bash
set -e
if [ "$1" = 'postgres' ]; then
chown -R postgres "$PGDATA"
if [ -z "$(ls -A "$PGDATA")" ]; then
gosu postgres initdb
fi
exec gosu postgres "$@"
fi
exec "$@"
Enfin, si vous avez besoin d'effectuer un nettoyage supplémentaire (ou de communiquer avec d'autres conteneurs) à l'arrêt, ou si vous voulez régler plusieurs ʻexecutables``, le script
ʻENTRYPOINT`` signalera un Unix. Vous devez vous assurer d'envoyer et de recevoir pour effectuer plus de travail.
#!/bin/sh
# Note: I've written this using sh so it works in the busybox container too
# USE the trap if you need to also do manual cleanup after the service is stopped,
# or need to start multiple services in the one container
trap "echo TRAPed signal" HUP INT QUIT TERM
# start service in background here
/usr/sbin/apachectl start
echo "[hit enter key to exit] or run 'docker stop <container>'"
read
# stop service and clean up here
echo "stopping apache"
/usr/sbin/apachectl stop
echo "exited $0"
Si vous exécutez cette image avec dockerrun -it --rm -p 80:80 --name test apache '', vous pouvez voir le processus du conteneur avec
docker exec '' ou `` docker top ''. Demandez aux scripts suivants d'arrêter Apache.
$ docker exec -it test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 4448 692 ? Ss+ 00:42 0:00 /bin/sh /run.sh 123 cmd cmd2
root 19 0.0 0.2 71304 4440 ? Ss 00:42 0:00 /usr/sbin/apache2 -k start
www-data 20 0.2 0.2 360468 6004 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start
www-data 21 0.2 0.2 360468 6000 ? Sl 00:42 0:00 /usr/sbin/apache2 -k start
root 81 0.0 0.1 15572 2140 ? R+ 00:44 0:00 ps aux
$ docker top test
PID USER COMMAND
10035 root {run.sh} /bin/sh /run.sh 123 cmd cmd2
10054 root /usr/sbin/apache2 -k start
10055 33 /usr/sbin/apache2 -k start
10056 33 /usr/sbin/apache2 -k start
$ /usr/bin/time docker stop test
test
real 0m 0.27s
user 0m 0.03s
sys 0m 0.03s
Mise en garde
Vous pouvez utiliser --entrypoint
pour remplacer le paramètre ʻENTRYPOINT``, mais cela ne peut définir
binary`` que sur
ʻexec (` `sh -c
Non utilisé).
Mise en garde
Le format ʻexec`` est analysé comme un tableau JSON. Autrement dit, vous devez utiliser des guillemets doubles (`` "
) avant et après le mot au lieu de guillemets simples (
'
`).
Contrairement au format shell, le format «exec» n'appelle pas la commande shell.
Cela signifie que le traitement normal du shell ne se produira pas.
Par exemple, ʻENTRYPOINT [" echo "," $ HOME "]
ne remplace pas la variable dans`` $ HOME``. Si un traitement shell est requis, utilisez le format shell ou exécutez directement le shell. Exemple:
ʻENTRYPOINT [" sh "," -c "," echo $ HOME "]
Si vous exécutez directement le shell en utilisant le format `ʻexec``, comme dans le format shell, c'est le shell, et non le Docker, qui étend les variables d'environnement.
Si vous spécifiez une chaîne de caractères simple pour ʻENTRYPOINT``, elle sera exécutée avec
/ bin / sh -c``. Ce formulaire utilise le traitement du shell pour remplacer les variables d'environnement du shell et ignore les arguments de ligne de commande `` CMD`` ou [docker run](https://qiita.com/JhonnyBravo/items/eee5a91682f1d7c72f6e). N'oubliez pas de commencer par
ʻexec pour` `docker stop
pour vous avertir correctement d'un exécutable` ʻENTRYPOINT '' de longue durée.
FROM ubuntu
ENTRYPOINT exec top -b
L'exécution de cette image montre un seul processus PID 1.
$ docker run -it --rm --name test top
Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached
CPU: 5% usr 0% sys 0% nic 94% idle 0% io 0% irq 0% sirq
Load average: 0.08 0.03 0.05 2/98 6
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
1 0 root R 3164 0% 0% top -b
Nettoyer avec `` docker stop '':
$ /usr/bin/time docker stop test
test
real 0m 0.20s
user 0m 0.02s
sys 0m 0.04s
Si vous oubliez d'ajouter ʻexec`` au début de
ʻENTRYPOINT``:
FROM ubuntu
ENTRYPOINT top -b
CMD --ignored-param1
Vous pouvez ensuite le faire (nommez l'étape suivante).
$ docker run -it --name test top --ignored-param2
Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached
CPU: 9% usr 2% sys 0% nic 88% idle 0% io 0% irq 0% sirq
Load average: 0.01 0.02 0.05 2/101 7
PID PPID USER STAT VSZ %VSZ %CPU COMMAND
1 0 root S 3168 0% 0% /bin/sh -c top -b cmd cmd2
7 1 root R 3164 0% 0% top -b
La sortie de top
montre que le `ʻENTRYPOINT`` spécifié n'est pas le PID 1.
Si vous exécutez ensuite le test d'arrêt du docker '', le conteneur ne s'arrêtera pas avec succès. Après le timeout, la commande
stop '' force l'envoi d'un `` SIGKILL ''.
$ docker exec -it test ps aux
PID USER COMMAND
1 root /bin/sh -c top -b cmd cmd2
7 root top -b
8 root ps aux
$ /usr/bin/time docker stop test
test
real 0m 10.19s
user 0m 0.04s
sys 0m 0.03s
CMD
et ```ENTRYPOINT``Les instructions CMD
et ENTRYPOINT`` définissent les commandes qui sont exécutées lorsque le conteneur est exécuté. Voici les règles qui décrivent la collaboration entre `` CMD`` et
ENTRYPOINT``.
CMD
ou ```ENTRYPOINT``.ʻexecutable`` dans un conteneur, vous devez définir
ʻENTRYPOINT``. CMD
doit être utilisé comme moyen de définir les arguments par défaut de la commande ```ENTRYPOINT`` ou comme moyen d'exécuter des commandes ad hoc dans un conteneur.Le tableau suivant montre les commandes exécutées pour différentes combinaisons ʻENTRYPOINT`` /
`CMD``.
No ENTRYPOINT | ENTRYPOINT exec_entry p1_entry | ENTRYPOINT [“exec_entry”, “p1_entry”] |
---|---|---|
No CMD | error, not allowed | /bin/sh -c exec_entry p1_entry |
CMD [“exec_cmd”, “p1_cmd”] | exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry |
CMD [“p1_cmd”, “p2_cmd”] | p1_cmd p2_cmd | /bin/sh -c exec_entry p1_entry |
CMD exec_cmd p1_cmd | /bin/sh -c exec_cmd p1_cmd | /bin/sh -c exec_entry p1_entry |
** Attention **
Si
CMD
est défini à partir de l'image de base, le réglage ```ENTRYPOINTréinitialisera
CMDà une valeur vide. Vous devez définir
CMD '' dans l'image courante pour définir la valeur dans ce scénario.
VOLUME
VOLUME ["/data"]
L'instruction VOLUME '' crée un point de montage avec le nom spécifié et le marque comme contenant un volume monté en externe à partir de l'hôte natif ou d'un autre conteneur. La valeur est le tableau JSON
VOLUME ["/ var / log /"] , ou
VOLUME / var / logou Il peut s'agir d'une chaîne simple avec plusieurs arguments, tels que
VOLUME / var / log / var / db``.
Consultez Partage de directeurs via des volumes (https://docs.docker.com/storage/volumes/) pour plus d'informations, des cas d'utilisation et des instructions de montage via le client Docker.
La commande docker run initialise le volume nouvellement créé avec les données qui existent à l'emplacement spécifié dans l'image de base. Par exemple, considérez l'extrait de code Dockerfile suivant:
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
Ce Dockerfile est un docker run qui crée un nouveau point de montage sur / myvol
et met un fichier Greeting
sur le volume nouvellement créé. Ce sera l'image à copier.
Notez ce qui suit à propos des volumes Dockerfile:
) au lieu de guillemets simples (
'
).VOLUME '' ne prend pas en charge la spécification du paramètre
host-dir ''.
Vous devez spécifier le point de montage lorsque vous créez ou exécutez le conteneur.USER
USER <user>[:<group>]
Ou
USER <UID>[:<GID>]
L'instruction ʻUSER`` est le nom d'utilisateur (ou UID) et éventuellement le groupe d'utilisateurs (ou UID) utilisé au moment de l'exécution de l'image et dans les instructions suivant
RUN``,
CMD`` et
ʻENTRYPOINT`` dans le Dockerfile. Ou GID).
Si vous spécifiez un groupe d'utilisateurs, gardez à l'esprit que les utilisateurs n'ont que l'appartenance au groupe spécifié. Les autres appartenances aux groupes configurés sont ignorées.
** Avertissement **
Si l'utilisateur n'a pas de groupe principal, l'image (ou l'étape suivante) s'exécutera dans le groupe racine.
Sous Windows, vous devez d'abord créer un utilisateur s'il ne s'agit pas d'un compte intégré. Cela peut être fait en utilisant la commande `` netuser '', qui est appelée dans le cadre du Dockerfile.
FROM microsoft/windowsservercore
# Create Windows user in the container
RUN net user /add patrick
# Set it for subsequent commands
USER patrick
WORKDIR
WORKDIR /path/to/workdir
L'instruction WORKDIR
est le répertoire de travail de toutes les instructions suivantes RUN
, CMD
, ```ENTRYPOINT,
COPYet
`ʻADDdans le Dockerfile. Ensemble. Si
WORKDIR '' n'existe pas, il sera créé même s'il n'est pas utilisé dans les instructions Dockerfile suivantes.
L'instruction WORKDIR '' peut être utilisée plusieurs fois dans un Dockerfile. Si un chemin relatif est spécifié, il sera relatif au chemin de l'instruction précédente
WORKDIR``. Par exemple:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
La sortie de la dernière commande pwd '' dans ce Dockerfile est
/ a / b / c``.
L'instruction WORKDIR
peut résoudre les variables d'environnement précédemment définies à l'aide de ```ENV``.
Vous ne pouvez utiliser que des variables d'environnement définies explicitement dans le Dockerfile.
Par exemple:
ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd
La sortie de la dernière commande pwd
dans ce Dockerfile sera / path / $ DIRNAME
.
ARG
ARG <name>[=<default value>]
L'instruction `ʻARG utilise l'indicateur
--build-arg
[Warning] One or more build-args [foo] were not consumed.
Le Dockerfile peut contenir une ou plusieurs instructions «ARG». Par exemple, ce qui suit est un Dockerfile valide.
FROM busybox
ARG user1
ARG buildno
# ...
** Avertissement **
Nous ne recommandons pas d'utiliser des variables de construction pour transmettre des informations sensibles telles que les clés github, les informations d'identification de l'utilisateur, etc. Les valeurs des variables au moment de la construction sont visibles par tous les utilisateurs de l'image à l'aide de la commande `` docker history ''.
Pour un moyen sécurisé d'utiliser des informations confidentielles lors de la création d'une image, utilisez BuildKit pour créer l'image (https://docs.docker.com/develop/develop-images/build_enhancements/#new- Voir docker-build-secret-information).
L'instruction «ARG» peut éventuellement inclure une valeur par défaut.
FROM busybox
ARG user1=someuser
ARG buildno=1
# ...
Si l'instruction `ʻARG`` a une valeur par défaut et qu'aucune valeur n'est passée au moment de la construction, le constructeur utilisera la valeur par défaut.
Scope
La définition de la variable «ARG» prend effet à partir de la ligne définie dans le Dockerfile, pas de l'utilisation d'arguments sur la ligne de commande ou ailleurs. Par exemple, considérez le Dockerfile suivant.
FROM busybox
USER ${user:-some_user}
ARG user
USER $user
# ...
L'utilisateur crée ce fichier en appelant la commande suivante:
$ docker build --build-arg user=what_user .
La deuxième ligne, ʻUSER``, donne la valeur
some_user`` parce que la variable utilisateur est définie dans la troisième ligne suivante. La quatrième ligne,
ʻUSER, évalue` `what_user
lorsque l'utilisateur est défini et la valeur
what_user est passée à la ligne de commande. Avant d'être défini par l'instruction `ʻARG
, l'utilisation d'une variable videra la chaîne.
L'instruction «ARG» sort du champ d'application à la fin de l'étape de construction dans laquelle elle est définie. Pour utiliser «arg» en plusieurs étapes, chaque étape doit inclure l'instruction «ARG».
FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGS
FROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
Vous pouvez utiliser l'instruction «ARG» ou «ENV» pour spécifier les variables disponibles dans l'instruction «RUN». Les variables d'environnement définies à l'aide de l'instruction «ENV» écrasent toujours l'instruction «ARG» du même nom. Considérez ce Dockerfile, qui contient les instructions «ENV» et «ARG».
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER
Ensuite, supposons que cette image a été créée avec la commande suivante:
$ docker build --build-arg CONT_IMG_VER=v2.0.1 .
Dans ce cas, l'instruction RUN
utilise v1.0.0 au lieu du paramètre ARG`` passé par
user: v2.0.1``.
Ce comportement est similaire à un script shell dans lequel une variable à portée locale écrase une variable passée en argument ou une variable héritée de l'environnement d'un point de vue définitionnel.
En utilisant l'exemple ci-dessus, mais avec une spécification différente «ENV», vous pouvez créer une interaction plus pratique entre les instructions «ARG» et «ENV».
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=${CONT_IMG_VER:-v1.0.0}
RUN echo $CONT_IMG_VER
Contrairement à l'instruction «ARG», la valeur «ENV» est toujours conservée dans l'image construite.
Prenons un docker build sans le drapeau --build-arg
:
$ docker build .
En utilisant cet exemple de Dockerfile, CONT_IMG_VER
est toujours conservé dans l'image, mais il s'agit de la v1.0.0 car c'est la valeur par défaut définie à la ligne 3 par l'instruction ```ENV``. ..
En utilisant la technique d'expansion variable de cet exemple, vous pouvez passer des arguments à partir de la ligne de commande Vous pouvez utiliser l'instruction `ʻENV`` pour les conserver dans l'image finale. L'expansion variable n'est prise en charge qu'avec une combinaison limitée d'instructions Dockerfile.
Docker dispose d'un ensemble de variables prédéfinies «ARG» qui peuvent être utilisées sans l'instruction «ARG» correspondante dans le Dockerfile.
Pour les utiliser, passez-les simplement sur la ligne de commande avec des indicateurs.
--build-arg <varname>=<value>
Par défaut, ces variables prédéfinies sont exclues de la sortie de docker history ''. L'exclusion des variables prédéfinies réduit le risque de fuite accidentelle d'informations d'identification sensibles dans la variable
HTTP_PROXY ''.
Envisagez de créer le Dockerfile suivant en utilisant, par exemple, `` --build-arg HTTP_PROXY = http: // user: pass @ proxy.lon.example.com ''.
FROM ubuntu
RUN echo "Hello World"
Dans ce cas, la valeur de la variable HTTP_PROXY '' n'est pas disponible dans
historique du docker '' et n'est pas mise en cache.
Si vous modifiez l'emplacement et que le serveur proxy est changé en `` http: // utilisateur: pass @ proxy.sfo.example.com '', les versions suivantes n'auront pas de cache manquant.
Si vous devez remplacer ce comportement, vous pouvez le remplacer en ajoutant l'instruction `ʻARG`` à votre Dockerfile comme suit:
FROM ubuntu
ARG HTTP_PROXY
RUN echo "Hello World"
Lorsque vous construisez ce Dockerfile, HTTP_PROXY '' est enregistré dans
Docker history '', et changer sa valeur invalidera le cache de construction.
Cette fonctionnalité n'est disponible que si vous utilisez le backend BuildKit.
Docker prédéfinit un ensemble de variables `ʻARGavec des informations sur la plate-forme du nœud effectuant la construction (plate-forme de construction) et la plate-forme de l'image résultante (plate-forme cible). La plateforme cible peut être spécifiée avec le drapeau
--platform`` dans docker build.
Les variables «ARG» suivantes sont définies automatiquement.
Ces arguments sont définis dans la portée globale et ne peuvent pas être utilisés automatiquement dans la phase de construction ou dans la commande RUN
.
Pour exposer l'un de ces arguments au cours de l'étape de génération, redéfinissez-le sans valeur.
Par exemple:
FROM alpine
ARG TARGETPLATFORM
RUN echo "I'm building for $TARGETPLATFORM"
Impact sur le cache de compilation
La variable «ARG» n'est pas conservée dans l'image construite comme la variable «ENV».
Cependant, la variable «ARG» affecte le cache de construction de la même manière.
Si le Dockerfile définit une variable ʻARG`` avec une valeur différente de celle des versions précédentes, vous obtiendrez un
`cache miss`` lors de la première utilisation au lieu de cette définition.
En particulier, toutes les instructions «RUN» qui suivent l'instruction «ARG» utilisent implicitement la variable «ARG» (comme variable d'environnement), ce qui peut conduire à des échecs de cache.
Toutes les variables prédéfinies «ARG» sont exclues du cache à moins qu'il n'y ait une instruction «ARG» correspondante dans le Dockerfile.
Par exemple, considérez les deux fichiers Dockerfiles suivants.
FROM ubuntu
ARG CONT_IMG_VER
RUN echo $CONT_IMG_VER
FROM ubuntu
ARG CONT_IMG_VER
RUN echo hello
Si vous spécifiez --build-arg CONT_IMG_VER = <valeur> '' sur la ligne de commande, la deuxième ligne ne provoquera pas de cache manquant dans les deux cas. La troisième ligne provoque un échec du cache. ```ARG CONT_IMG_VER
identifie la ligne RUN
comme étant identique à l'exécution de CONT_IMG_VER = <valeur> echo hello
, elle sera donc mise en cache lorsque <value>
est modifiée. Une erreur se produira.
Prenons un autre exemple sur la même ligne de commande.
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=$CONT_IMG_VER
RUN echo $CONT_IMG_VER
Dans cet exemple, l'erreur de cache se produit sur la ligne 3. Une erreur de cache se produit car la valeur de la variable «ENV» fait référence à la variable «ARG» et cette variable est modifiée sur la ligne de commande. Dans cet exemple, la commande «ENV» contient une valeur dans l'image.
Si l'instruction ʻENV`` remplace l'instruction
ʻARG`` avec le même nom, comme dans ce Dockerfile:
FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER=hello
RUN echo $CONT_IMG_VER
Dans la troisième ligne, la valeur de CONT_IMG_VER '' est une constante (bonjour), donc aucun échec de cache ne se produit. Par conséquent, les variables d'environnement et les valeurs utilisées dans
RUN '' (ligne 4) ne changent pas entre les builds.
ONBUILD
ONBUILD <INSTRUCTION>
L'instruction «ONBUILD» ajoute à l'image une instruction de déclenchement qui sera exécutée plus tard lorsque l'image sera utilisée comme base pour une autre construction. Le déclencheur s'exécute dans le contexte d'une construction en aval, comme s'il était inséré immédiatement après l'instruction `` FROM '' dans le Dockerfile en aval.
Toute instruction de construction peut être enregistrée comme déclencheur.
Ceci est utile lors de la construction d'une image qui sera utilisée comme base pour la construction d'autres images. Par exemple, un environnement de construction d'application ou un démon qui peut être personnalisé avec votre propre configuration.
Par exemple, si l'image est un générateur d'application Python réutilisable, vous devrez peut-être ajouter le code source de l'application à un répertoire spécifique, puis appeler le script de génération.
Vous ne pouvez pas simplement appeler ```ADDet
RUN`` maintenant car le code source de l'application n'est pas encore accessible et varie d'une version à l'autre.
Vous pouvez également fournir le Dockerfile de la plaque chauffante au développeur de l'application et le copier et le coller dans l'application,
Ceci est inefficace, sujet aux erreurs et mélangé avec du code spécifique à l'application, ce qui rend la mise à jour difficile.
La solution est d'utiliser «ONBUILD» pour enregistrer une pré-instruction à exécuter plus tard dans la prochaine étape de construction.
Le mécanisme est le suivant.
dans le manifeste de l'image. Ils peuvent être inspectés avec la commande
docker inspect ''.FROM '' pour utiliser l'image comme base pour une nouvelle construction. Dans le cadre du traitement des instructions
FROM '', le constructeur en aval recherche les déclencheurs ```ONBUILDet les exécute dans le même ordre où ils ont été enregistrés. Si l'un des déclencheurs échoue, l'instruction
FROM '' sera abandonnée et la construction échouera.
Si tous les déclencheurs réussissent, l'instruction `` FROM '' est terminée et la construction se poursuit normalement.Par exemple, vous pouvez ajouter quelque chose comme ceci:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
** Avertissement **
ʻONBUILD ONBUILD`` n'est pas autorisé à enchaîner les instructions
ʻONBUILD``.L'instruction
ONBUILD '' peut ne pas déclencher l'instruction
FROM '' ou `` MAINTAINER ''.
STOPSIGNAL
STOPSIGNAL signal
L'instruction STOPSIGNAL '' définit le signal d'appel système envoyé au conteneur pour se terminer. Ce signal doit être un nombre non signé valide qui correspond à une position dans la table
syscall '' du noyau (par exemple 9), ou un nom de signal sous la forme SIGNAME '' (par exemple
SIGKILL ''). Je peux.
HEALTHCHECK
La déclaration `` HEALTHCHECK '' se présente sous deux formes:
HEALTHCHECK [OPTIONS] CMD command
(Exécutez une commande à l'intérieur du conteneur pour vérifier l'état du conteneur)L'instruction `` HEALTHCHECK '' indique à Docker comment tester le conteneur pour s'assurer qu'il fonctionne toujours. Cela vous permet de détecter les cas où le serveur Web est bloqué dans une boucle infinie et ne peut pas gérer de nouvelles connexions, même si le processus serveur est toujours en cours d'exécution.
Si un conteneur a une vérification de l'état spécifiée, il a un état d'intégrité en plus de l'état normal. Cet état est initialement "Démarrage". Si vous réussissez la vérification de l'état, la vérification de l'état sera "normale" (quel que soit l'état précédent). Après un certain nombre de pannes consécutives, cela devient "anormal".
Les options qui apparaissent avant `` CMD '' sont:
--interval = DURATION
(par défaut: 30s) --timeout = DURATION
(par défaut: 30s) --start-period = DURATION
(par défaut: 0s)La vérification de l'état s'exécute quelques secondes après le premier démarrage du conteneur, puis à nouveau quelques secondes après la fin de chaque vérification précédente.
Si une vérification dure plus longtemps que les secondes du délai d'expiration, la vérification est considérée comme infructueuse.
Les échecs successifs des contrôles de santé doivent être retentés pour que le conteneur soit considéré comme anormal.
La période de début fournit le temps d'initialisation du conteneur, ce qui nécessite du temps pour le bootstrap. Les échecs de sonde pendant cette période ne comptent pas dans le nombre maximal de tentatives. Toutefois, si la vérification de l'état réussit pendant la période de démarrage, le conteneur est considéré comme démarré et tous les échecs consécutifs sont comptés dans le nombre maximal de tentatives.
Il ne peut y avoir qu'une seule instruction HEALTHCHECK '' dans un Dockerfile. Si vous répertoriez plusieurs éléments, seul le dernier
HEALTHCHECK '' sera valide.
La commande après le mot-clé CMD
est soit une commande shell (par exemple, HEALTHCHECK CMD / bin / check-running
) ou un tableau ```exec (comme toute autre commande Dockerfile). (Voir `ʻENTRYPOINT
pour plus d'informations)
L'état de fin de la commande indique l'état de santé du conteneur. Les valeurs valides sont:
Par exemple, pour vérifier toutes les 5 minutes et permettre au serveur Web de servir la page principale de votre site dans les 3 secondes:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
Pour aider au débogage d'une sonde ayant échoué, le texte de sortie (encodé en UTF-8) que la commande écrit dans stdout '' ou
stderr '' est stocké dans l'état de santé et peut être recherché par `` docker inspect ''. ..
Cette sortie doit être courte (actuellement, seuls les 4096 premiers octets sont stockés).
Lorsque l'état de santé d'un conteneur change, un événement `` health_status '' est généré avec le nouvel état.
La fonctionnalité `` HEALTHCHECK '' a été ajoutée dans Docker 1.12.
SHELL
SHELL ["executable", "parameters"]
Vous pouvez utiliser l'instruction SHELL '' pour remplacer le shell par défaut utilisé pour les commandes de style shell. Le shell par défaut pour Linux est
["/ bin / sh", "-c"] . Le shell par défaut pour Windows est
["cmd", "/ S", "/ C"] . L'instruction
SHELL '' doit être au format JSON dans le Dockerfile.
L'instruction SHELL '' est disponible sur Windows avec deux shells natifs couramment utilisés (
cmd '' et powershell '') et un shell alternatif qui inclut
sh ''. Particulièrement utile.
L'instruction SHELL '' peut être affichée plusieurs fois. Chaque instruction
SHELL '' écrase toutes les instructions `` SHELL '' précédentes et affecte toutes les instructions suivantes.
Exemple:
FROM microsoft/windowsservercore
# Executed as cmd /S /C echo default
RUN echo default
# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default
# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello
# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S", "/C"]
RUN echo hello
Les instructions suivantes peuvent être affectées par l'instruction `` SHELL '' lorsque le format shell est utilisé dans le Dockerfile:
RUN
CMD
ENTRYPOINT
L'exemple suivant est un modèle courant trouvé sur Windows qui peut être simplifié à l'aide de l'instruction `` SHELL ''.
RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
La commande appelée par docker ressemble à ceci:
cmd /S /C powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
Ceci est inefficace pour deux raisons.
Tout d'abord, le processeur de commande indésirable cmd.exe '' (également connu sous le nom de shell) est appelé. Deuxièmement, chaque instruction
RUN '' de style shell nécessite une `` commande powershell '' supplémentaire avant la commande.
Vous pouvez utiliser l'un des deux mécanismes pour rendre cela plus efficace.
La première consiste à utiliser le format JSON de la commande RUN
, qui ressemble à ceci:
RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""]
Le format JSON est clair et n'utilise pas le cmd.exe '' inutile, mais les guillemets et les échappements nécessitent des informations plus détaillées. Un autre mécanisme consiste à utiliser l'instruction
SHELL '' et le formulaire shell.
Cela rend la syntaxe plus naturelle pour les utilisateurs Windows, en particulier lorsqu'elle est combinée avec des directives d'analyseur d'échappement.
# escape=`
FROM microsoft/nanoserver
SHELL ["powershell","-command"]
RUN New-Item -ItemType Directory C:\Example
ADD Execute-MyCmdlet.ps1 c:\example\
RUN c:\example\Execute-MyCmdlet -sample 'hello world'
Résultat de l'exécution:
PS E:\docker\build\shell> docker build -t shell .
Sending build context to Docker daemon 4.096 kB
Step 1/5 : FROM microsoft/nanoserver
---> 22738ff49c6d
Step 2/5 : SHELL powershell -command
---> Running in 6fcdb6855ae2
---> 6331462d4300
Removing intermediate container 6fcdb6855ae2
Step 3/5 : RUN New-Item -ItemType Directory C:\Example
---> Running in d0eef8386e97
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 10/28/2016 11:26 AM Example
---> 3f2fbf1395d9
Removing intermediate container d0eef8386e97
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\
---> a955b2621c31
Removing intermediate container b825593d39fc
Step 5/5 : RUN c:\example\Execute-MyCmdlet 'hello world'
---> Running in be6d8e63fe75
hello world
---> 8e559e9bf424
Removing intermediate container be6d8e63fe75
Successfully built 8e559e9bf424
PS E:\docker\build\shell>
L'instruction SHELL '' peut également être utilisée pour changer le comportement du shell. Par exemple, sous Windows, vous pouvez utiliser
SHELL cmd / S / C / V: ON | OFF '' pour changer la sémantique étendue des variables d'environnement différées.
L'instruction `` SHELL '' peut également être utilisée sous Linux si un shell alternatif tel que zsh, csh, tcsh est requis.
La fonctionnalité `` SHELL '' a été ajoutée dans Docker 1.12.
Cette fonctionnalité n'est disponible que si vous utilisez le backend BuildKit.
docker build est activé en utilisant une implémentation externe du générateur avec des directives de syntaxe, telles que le montage du cache, le build secret, le transfert ssh, etc. Prend en charge les fonctionnalités expérimentales. Consultez la documentation du référentiel BuildKit (https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md) pour ces fonctionnalités.
Voici quelques exemples de syntaxe Dockerfile:
# Nginx
#
# VERSION 0.0.1
FROM ubuntu
LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["x11vnc", "-forever", "-usepw", "-create"]
# Multiple images example
#
# VERSION 0.1
FROM ubuntu
RUN echo foo > bar
# Will output something like ===> 907ad6c2736f
FROM ubuntu
RUN echo moo > oink
# Will output something like ===> 695d7793cbe4
# You'll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
# /oink.
Recommended Posts