web-dev-qa-db-fra.com

Quel est l'intérêt d'utiliser la commande WORKDIR dans Dockerfile

J'apprends Docker. Plusieurs fois, j'ai vu que Dockerfile avait la commande WORKDIR 

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” ] 

Est-ce que je ne peux pas simplement omettre WORKDIR et Copy et simplement avoir Dockerfile à la racine de mon projet? Quels sont les inconvénients de l'utilisation de cette approche?

13
Ivan Prizov

Selon la documentation :

L'instruction WORKDIR définit le répertoire de travail pour tout RUN, CMD, Les instructions ENTRYPOINT, COPY et ADD qui suivent dans le fichier Dockerfile.

En outre, dans les Meilleures pratiques de Docker il vous recommande de l’utiliser:

... vous devez utiliser WORKDIR au lieu de multiplier les instructions telles que RUN cd… && do-quelquechose qui sont difficiles à lire, à résoudre, et maintenir.

Je suggérerais de le garder.

Je pense que vous pouvez refactoriser votre fichier Dockerfile à quelque chose comme:

FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . ./
EXPOSE 3000
CMD [ “npm”, “start” ] 
19
juanlumn

Vous n'avez pas à 

RUN mkdir -p /usr/src/app

Ceci sera créé automatiquement lorsque vous spécifiez votre WORKDIR

FROM node:latest
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . ./
EXPOSE 3000
CMD [ “npm”, “start” ] 
14
Samuel Dare

Vous pouvez penser à WORKDIR comme une cd à l'intérieur du conteneur (cela affecte les commandes qui apparaissent plus tard dans le fichier Docker, comme la commande RUN). Si vous avez supprimé WORKDIR dans votre exemple ci-dessus, RUN npm install ne fonctionnerait pas car vous ne seriez pas dans le répertoire /usr/src/app de votre conteneur.

Je ne vois pas en quoi cela serait lié à l'emplacement de votre fichier Dockerfile (car l'emplacement de votre fichier Dockerfile sur l'ordinateur hôte n'a rien à voir avec le pwd contenu dans le conteneur). Vous pouvez placer le fichier Dockerfile où vous le souhaitez dans votre projet. Cependant, le premier argument de COPY est un chemin relatif. Par conséquent, si vous déplacez votre fichier Docker, vous devrez peut-être mettre à jour ces commandes COPY.

9
mkasberg

Avant d'appliquer WORKDIR. Ici, le WORKDIR est au mauvais endroit et n’est pas utilisé à bon escient.

FROM Microsoft/aspnetcore:2
COPY --from=build-env /publish /publish
WORKDIR /publish
ENTRYPOINT ["dotnet", "/publish/api.dll"]

Nous avons corrigé le code ci-dessus pour placer WORKDIR au bon endroit et optimisé les instructions suivantes en supprimant /Publish

FROM Microsoft/aspnetcore:2
WORKDIR /publish
COPY --from=build-env /publish .
ENTRYPOINT ["dotnet", "/api.dll"]
0
Blue Clouds