Estou aprendendo Docker. Por muitas vezes eu vi que Dockerfile
tem WORKDIR
comando:
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” ]
Não posso simplesmente omitir WORKDIR
e Copy
ter o meu Dockerfile
na raiz do meu projeto? Quais são as desvantagens de usar essa abordagem?
docker
dockerfile
Le garcon
fonte
fonte
WORKDIR
Respostas:
De acordo com a documentação :
Além disso, nas práticas recomendadas do Docker, ele recomenda que você o use:
Eu sugeriria mantê-lo.
Acho que você pode refatorar seu Dockerfile para algo como:
fonte
FROM ubuntu as builder
e depois uso a imagem sucessivaCOPY
, ela "sabe" que usei WORKDIR na imagem "builder" ou devo presumir que não (e usar um caminho absoluto)?WORKDIR
valor, porque é um ran instrução na Dockerfile antes de executar aCOPY
umRUN mkdir
comando não é necessário; ou seja, essa linha pode ser excluída. De acordo com a documentação "Se o WORKDIR não existir, ele será criado mesmo se não for usado em nenhuma instrução Dockerfile subsequente." - docs.docker.com/engine/reference/builder/#workdirVocê não tem que
RUN mkdir -p /usr/src/app
Isso será criado automaticamente quando você especificar seu
WORKDIR
fonte
Você pode pensar em
WORKDIR
comocd
dentro do contêiner (isso afeta os comandos que vêm posteriormente no Dockerfile, como oRUN
comando). Se você removeuWORKDIR
em seu exemplo acima,RUN npm install
não funcionaria porque você não estaria no/usr/src/app
diretório dentro de seu contêiner.Não vejo como isso estaria relacionado a onde você coloca o Dockerfile (já que a localização do Dockerfile na máquina host não tem nada a ver com o pwd dentro do contêiner). Você pode colocar o Dockerfile onde quiser em seu projeto. No entanto, o primeiro argumento para
COPY
é um caminho relativo, portanto, se você mover o Dockerfile, pode ser necessário atualizar essesCOPY
comandos.fonte
WORKDIR
adicionar likecd
, os doisCOPY
no exemplo original não terão a mesma origem e destino?WORKDIR
Afeta o diretório de trabalho dentro do contêiner . No exemplo original, as primeirasCOPY
cópias dopackage.json
host (caminho relativo para o Dockerfile) para/usr/src/app/package.json
o contêiner . Na verdade, oWORKDIR
não tem impacto naquele comando específico porque o destino (dentro do contêiner) não está usando um caminho relativo (o caminho começa com/
).WORKDIR
atua como umcd
. Então, os 2 trechos abaixo são equivalentes?WORKDIR /usr/src/app
COPY package.json /usr/src/app/
eWORKDIR /usr/src/app
COPY package.json .
obrigadoAntes de aplicar o WORKDIR. Aqui, o WORKDIR está no lugar errado e não é usado com sabedoria.
Corrigimos o código acima para colocar WORKDIR no local correto e otimizamos as seguintes instruções removendo
/Publish
fonte
Cuidado ao usar vars como o nome do diretório de destino para
WORKDIR
- fazer isso parece resultar em um erro fatal "não pode normalizar nada". IMO, também é importante ressaltar queWORKDIR
se comporta da mesma forma,mkdir -p <path>
ou seja, todos os elementos do caminho são criados, caso ainda não existam.ATUALIZAÇÃO: encontrei o problema relacionado à variável (mencionado acima) durante a execução de uma compilação de vários estágios - agora parece que usar uma variável está bem - se ela (a variável) estiver "no escopo", por exemplo, no seguinte, a 2ª
WORKDIR
referência falha ...ao passo que ele consegue isso ...
.oO ( talvez esteja nos documentos e eu tenha esquecido )
fonte
Tenha cuidado onde você define
WORKDIR
porque pode afetar o fluxo de integração contínua. Por exemplo, configurá-lo para/home/circleci/project
causará um erro semelhante.ssh
ou o que quer que o circleci remoto esteja fazendo no momento da configuração.fonte