关于Docker:在Dockerfile上使用WORKDIR有什么意义?

What is the point of WORKDIR on Dockerfile?

我正在学习Docker。 我已经多次看到Dockerfile具有WORKDIR命令:

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

我不能只省略WORKDIRCopy并将我的Dockerfile放在项目的根目录吗? 使用这种方法的缺点是什么?


根据文档:

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


你不必

RUN mkdir -p /usr/src/app

当您指定WORKDIR时,它将自动创建

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


您可以将WORKDIR视为容器内的cd(它会影响Dockerfile中稍后出现的命令,例如RUN命令)。如果在上面的示例中删除了WORKDIR,则RUN npm install将不起作用,因为您将不在容器内的/usr/src/app目录中。

我看不到这与您放置Dockerfile的位置有什么关系(因为您在主机上的Dockerfile位置与容器内的pwd无关)。您可以将Dockerfile放置在项目中的任何位置。但是,COPY的第一个参数是相对路径,因此,如果移动Dockerfile,则可能需要更新这些COPY命令。


在应用WORKDIR之前。这里的WORKDIR放在错误的位置,不明智地使用。

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

我们更正了以上代码,将WORKDIR放在正确的位置,并通过删除/Publish优化了以下语句

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 /中。或任何其他专用工作目录。

另一种可能性是您的应用程序依赖于某个绝对路径。

除此之外,这取决于您。