What is the point of WORKDIR on Dockerfile?
我正在学习Docker。 我已经多次看到
1 2 3 4 5 6 7 8 | 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" ] |
我不能只省略
根据文档:
The WORKDIR instruction sets the working directory for any RUN, CMD,
ENTRYPOINT, COPY and ADD instructions that follow it in the
Dockerfile.
另外,在Docker最佳实践中,它建议您使用它:
... you should use WORKDIR instead of proliferating instructions like
RUN cd … && do-something, which are hard to read, troubleshoot, and
maintain.
我建议保留它。
我认为您可以将Dockerfile重构为以下形式:
1 2 3 4 5 6 7 8 | 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" ] |
你不必
当您指定
1 2 3 4 5 6 7 | FROM node:latest WORKDIR /usr/src/app COPY package.json . RUN npm install COPY . ./ EXPOSE 3000 CMD ["npm","start" ] |
您可以将
我看不到这与您放置Dockerfile的位置有什么关系(因为您在主机上的Dockerfile位置与容器内的pwd无关)。您可以将Dockerfile放置在项目中的任何位置。但是,
在应用WORKDIR之前。这里的WORKDIR放在错误的位置,不明智地使用。
1 2 3 4 | FROM microsoft/aspnetcore:2 COPY --from=build-env /publish /publish WORKDIR /publish ENTRYPOINT ["dotnet","/publish/api.dll"] |
我们更正了以上代码,将WORKDIR放在正确的位置,并通过删除
1 2 3 4 | FROM microsoft/aspnetcore:2 WORKDIR /publish COPY --from=build-env /publish . ENTRYPOINT ["dotnet","/api.dll"] |
可以的,那很好。有时您希望在容器上安装终端以进行调试。
1 | docker exec -it [container-id] bash |
资源
如果这样做,某些人会觉得很高兴在/ usr / src / app中找到他们的应用程序。或在/ mkasberg /中。或任何其他专用工作目录。
另一种可能性是您的应用程序依赖于某个绝对路径。
除此之外,这取决于您。