Я изучаю Докер. Я много раз видел, что 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
в корне моего проекта? Каковы недостатки использования этого подхода?
docker
dockerfile
Le Garcon
источник
источник
WORKDIR
Ответы:
По документации :
Кроме того, в лучших практиках Docker рекомендуется использовать его:
Я бы посоветовал оставить его себе.
Я думаю, вы можете реорганизовать свой Dockerfile примерно так:
источник
FROM ubuntu as builder
а затем последовательно использую изображениеCOPY
, «знает» ли он, что я использовал WORKDIR в образе «построителя», или я должен предполагать, что нет (и использовать абсолютный путь)?WORKDIR
значение , потому что это RAN инструкции в Dockerfile , прежде чем запуститьCOPY
одинRUN mkdir
команда не нужна; т.е. эту строку можно удалить. Согласно документации, «Если WORKDIR не существует, он будет создан, даже если он не будет использоваться в последующих инструкциях Dockerfile». - docs.docker.com/engine/reference/builder/#workdirВам не нужно
RUN mkdir -p /usr/src/app
Он будет создан автоматически, когда вы укажете свой
WORKDIR
источник
Вы можете думать об этом
WORKDIR
как оcd
внутри контейнера (он влияет на команды, которые появляются позже в Dockerfile, например, наRUN
команду). Если вы удалилиWORKDIR
в своем примере выше,RUN npm install
это не сработает, потому что вы не будете в/usr/src/app
каталоге внутри вашего контейнера.Я не понимаю, как это связано с тем, куда вы помещаете свой Dockerfile (поскольку местоположение вашего Dockerfile на хост-машине не имеет ничего общего с pwd внутри контейнера). Вы можете разместить Dockerfile в любом месте вашего проекта. Однако первый аргумент для
COPY
- это относительный путь, поэтому, если вы переместите свой Dockerfile, вам может потребоваться обновить этиCOPY
команды.источник
WORKDIR
добавить подобноеcd
, не будут ли у двухCOPY
в исходном примере один и тот же источник и место назначения?WORKDIR
Влияет на рабочий каталог внутри контейнера . В исходном примере первыеCOPY
копии сpackage.json
хоста (относительный путь к Dockerfile)/usr/src/app/package.json
в контейнер . Фактически, этоWORKDIR
не влияет на эту конкретную команду, потому что место назначения (внутри контейнера) не использует относительный путь (путь начинается с/
).WORKDIR
действует какcd
. Так эквивалентны ли 2 фрагмента ниже?WORKDIR /usr/src/app
COPY package.json /usr/src/app/
иWORKDIR /usr/src/app
COPY package.json .
спасибоПеред применением WORKDIR. Здесь WORKDIR находится не в том месте и используется неразумно.
Мы исправили приведенный выше код, чтобы поместить WORKDIR в нужное место, и оптимизировали следующие операторы, удалив
/Publish
источник
Остерегайтесь использования vars в качестве имени целевого каталога для
WORKDIR
- это может привести к фатальной ошибке «ничего не может нормализовать». IMO, также стоит отметить, что онWORKDIR
ведет себя так же, как иmkdir -p <path>
все элементы пути, если они еще не существуют.ОБНОВЛЕНИЕ: я столкнулся с проблемой, связанной с переменной (упомянутой выше), при запуске многоэтапной сборки - теперь кажется, что использование переменной нормально - если она (переменная) находится «в области действия», например, в следующем примере, вторая
WORKDIR
ссылка не работает ...тогда как он преуспевает в этом ...
.oO ( Возможно, это в документации, и я это пропустил )
источник
Будьте осторожны при установке,
WORKDIR
поскольку это может повлиять на поток непрерывной интеграции. Например, установка его на/home/circleci/project
вызовет ошибку, что-то вроде.ssh
или того, что удаленный circleci делает во время установки.источник