dockerdockerfile

What is the point of WORKDIR on Dockerfile?


I'm learning Docker. For many times I've seen that Dockerfile has WORKDIR command:

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

Can't I just omit WORKDIR and Copy and just have my Dockerfile at the root of my project? What are the downsides of using this approach?


Solution

  • According to the documentation:

    The WORKDIR instruction sets the working directory for any RUN, CMD, ENTRYPOINT, COPY and ADD instructions that follow it in the Dockerfile. If the WORKDIR doesn’t exist, it will be created even if it’s not used in any subsequent Dockerfile instruction.

    Also, in the Docker best practices it recommends you to use it:

    ... you should use WORKDIR instead of proliferating instructions like RUN cd … && do-something, which are hard to read, troubleshoot, and maintain.

    I would suggest to keep it.

    I think you can refactor your Dockerfile to something like:

    FROM node:latest
    WORKDIR /usr/src/app
    COPY package.json .
    RUN npm install
    COPY . ./
    EXPOSE 3000
    CMD [ "npm", "start" ]