Какой смысл работы 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/. Или любой другой выделенный рабочий каталог.
Другая возможность заключается в том, что ваше приложение опирается на определенный абсолютный путь.
Кроме этого, это зависит от вас.