Какой смысл работы WORKDIR на Dockerfile?

Я учу Докер. Много раз я видел, что Dockerfile имеет 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" ] 

Разве я не могу просто опустить WORKDIR и Copy и просто Dockerfile свой Dockerfile в корне моего проекта? Каковы недостатки использования этого подхода?

Ответ 1

Согласно документации:

Инструкция WORKDIR устанавливает рабочий каталог для любых инструкций RUN, CMD, ENTRYPOINT, COPY и ADD, которые следуют за ним в файле Docker.

Кроме того, в рекомендациях Docker рекомендуется использовать его:

... вы должны использовать WORKDIR вместо расширенных инструкций, таких как RUN cd... && do-something, которые трудно читать, устранять неполадки и поддерживать.

Я бы предложил сохранить его.

Я думаю, что вы можете реорганизовать свой файл Dockerfile примерно так:

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

Ответ 2

Вам не нужно

RUN mkdir -p/usr/src/app

Это будет создано автоматически, когда вы укажете свой WORKDIR

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

Ответ 3

Вы можете думать о WORKDIR как о cd внутри контейнера (он влияет на команды, которые появляются позже в файле Dockerfile, например, команда RUN). Если вы удалили WORKDIR в приведенном выше примере, RUN npm install не будет работать, потому что вы не будете в каталоге /usr/src/app внутри вашего контейнера.

Я не вижу, как это будет связано с тем, где вы помещаете свой файл Docker (поскольку ваше местоположение Dockerfile на главной машине не имеет ничего общего с pwd внутри контейнера). Вы можете поместить файл Docker везде, где захотите, в своем проекте. Однако первым аргументом COPY является относительный путь, поэтому, если вы переместите свой файл Docker, вам может понадобиться обновить эти команды COPY.

Ответ 4

Перед применением WORKDIR. Здесь WORKDIR находится в неправильном месте и не используется мудро.

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

Мы скорректировали вышеуказанный код, чтобы поместить WORKDIR в нужное место и оптимизировали следующие утверждения, удалив /Publish

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

Ответ 5

Вы можете, и это прекрасно. Иногда вы хотите получить терминал в контейнере для целей отладки.

docker exec -it [container-id] bash

Источник

Если вы это сделаете, некоторым людям приятно найти их приложение в /usr/src/app. Или в /mkasberg/. Или любой другой выделенный рабочий каталог.

Другая возможность заключается в том, что ваше приложение опирается на определенный абсолютный путь.

Кроме этого, это зависит от вас.