J'apprends Docker. Depuis de nombreuses fois, j'ai vu qui Dockerfile
a la WORKDIR
commande:
FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 3000
CMD [ “npm”, “start” ]
Puis-je simplement omettre WORKDIR
et Copy
et simplement avoir mon Dockerfile
à la racine de mon projet? Quels sont les inconvénients de cette approche?
docker
dockerfile
Le garcon
la source
la source
WORKDIR
Réponses:
Selon la documentation :
En outre, dans les bonnes pratiques de Docker, il vous recommande de l'utiliser:
Je suggérerais de le garder.
Je pense que vous pouvez refactoriser votre Dockerfile en quelque chose comme:
la source
FROM ubuntu as builder
et ensuite l'utilisation de l'image successiveCOPY
, est-ce qu'il "sait" que j'ai utilisé WORKDIR dans l'image "constructeur" ou je dois supposer que non (et utiliser un chemin absolu)?WORKDIR
valeur car une instruction est exécutée dans le Dockerfile avant d'exécuter celle-COPY
ciRUN mkdir
commande n'est pas nécessaire; c'est-à-dire que cette ligne pourrait être supprimée. Selon la documentation "Si le WORKDIR n'existe pas, il sera créé même s'il n'est utilisé dans aucune instruction Dockerfile ultérieure." - docs.docker.com/engine/reference/builder/#workdirTu n'as pas à
RUN mkdir -p /usr/src/app
Celui-ci sera créé automatiquement lorsque vous spécifiez votre
WORKDIR
la source
Vous pouvez penser
WORKDIR
comme uncd
intérieur du récipient (il affecte les commandes qui viennent plus tard dans la Dockerfile, comme laRUN
commande). Si vous avez suppriméWORKDIR
dans votre exemple ci-dessus,RUN npm install
ne fonctionnerait pas car vous ne seriez pas dans le/usr/src/app
répertoire à l'intérieur de votre conteneur.Je ne vois pas comment cela serait lié à l'endroit où vous placez votre Dockerfile (puisque l'emplacement de votre Dockerfile sur la machine hôte n'a rien à voir avec le pwd à l'intérieur du conteneur). Vous pouvez placer le Dockerfile où vous le souhaitez dans votre projet. Cependant, le premier argument vers
COPY
est un chemin relatif, donc si vous déplacez votre Dockerfile, vous devrez peut-être mettre à jour cesCOPY
commandes.la source
WORKDIR
ajoute commecd
, les deuxCOPY
dans l'exemple d'origine n'auront-ils pas la même source et la même destination?WORKDIR
affecte le répertoire de travail à l'intérieur du conteneur . Dans l'exemple d'origine, les premièresCOPY
copies depuispackage.json
l'hôte (chemin relatif vers le Dockerfile) vers/usr/src/app/package.json
le conteneur . En fait, leWORKDIR
n'a aucun impact sur cette commande particulière car la destination (à l'intérieur du conteneur) n'utilise pas de chemin relatif (le chemin commence par/
).WORKDIR
agit comme uncd
. Alors, les 2 extraits ci-dessous sont-ils équivalents?WORKDIR /usr/src/app
COPY package.json /usr/src/app/
etWORKDIR /usr/src/app
COPY package.json .
merciAvant d'appliquer WORKDIR. Ici, le WORKDIR est au mauvais endroit et n'est pas utilisé à bon escient.
Nous avons corrigé le code ci-dessus pour mettre WORKDIR au bon endroit et optimisé les instructions suivantes en supprimant
/Publish
la source
Méfiez-vous de l'utilisation de vars comme nom de répertoire cible pour
WORKDIR
- faire cela semble entraîner une erreur fatale "ne peut rien normaliser". OMI, il convient également de souligner qu'ilWORKDIR
se comporte de la même manière quemkdir -p <path>
c'est- à- dire que tous les éléments du chemin sont créés s'ils n'existent pas déjà.MISE À JOUR: J'ai rencontré le problème lié aux variables (mentionné ci-dessus) lors de l'exécution d'une construction en plusieurs étapes - il semble maintenant que l'utilisation d'une variable convient - si elle (la variable) est "dans la portée", par exemple dans ce qui suit, la deuxième
WORKDIR
référence échoue ...alors qu'il y parvient ...
.oO ( Peut-être que c'est dans la documentation et je l'ai manqué )
la source
Soyez prudent lorsque vous définissez,
WORKDIR
car cela peut affecter le flux d'intégration continue. Par exemple, le paramétrer sur/home/circleci/project
provoquera une erreur comme.ssh
ou quoi que ce soit que fait le circleci distant au moment de l'installation.la source