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?
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” ]
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” ]
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
.
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"]