Какой смысл работы WORKDIR на Dockerfile? - PullRequest
0 голосов
/ 27 июня 2018

Я учу Докер. Много раз я видел, что 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 в корне моего проекта? Каковы недостатки использования этого подхода?

Ответы [ 5 ]

0 голосов
/ 24 октября 2018

Вам не нужно

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” ] 
0 голосов
/ 30 сентября 2018

Перед применением 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"]
0 голосов
/ 27 июня 2018

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

docker exec -it [container-id] bash

Источник

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

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

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

0 голосов
/ 27 июня 2018

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

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

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

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

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

Я думаю, вы можете изменить свой 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” ] 
0 голосов
/ 27 июня 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...