DEV Community

Nova Script
Nova Script

Posted on

[DOCKER] [NODE]: Como 'buildar' a node_modules só quando for necessário!

Introdução:

Nem todas as vezes que mudamos nosso código, isso significa que nós implementamos novas dependências: se não inserimos nenhum pacote novo no nosso projeto, então não há motivo algum para reconstruir (rebuild) a pasta node_modules.

Então, vamos entender como melhorar nossa eficiência, já que nosso tempo de debugging e desenvolvimento para aplicações Node rodando Docker será significantemente reduzido.

Como Node Dockerfiles são implementados normalmente:

Vamos olhar rapidinho esse Dockerfile que está mal implementado.

FROM node:16

# Cria diretório do aplicativo
WORKDIR /usr/src/app

# Copia o código inteiro
COPY . .

# Instala as dependências
RUN npm install

# Roda o servidor
EXPOSE 8080
CMD [ "node", "server.js" ]
Enter fullscreen mode Exit fullscreen mode

Todo o problema de eficiência aqui reside
na linha COPY . ..

Isso é ruim, pois fazer isso significa que: todas as vezes que você fizer uma mudança no código presente em ., a pasta node_modules terá que ser reconstruída, de novo e de novo e de novo...

Arrumando isso:

Ao invés disso, nós devemos primeiramente copiar apenas nosso arquivo package.json e package-lock.json (que controlam nossas dependências) para o diretório do aplicativo e então instalar elas.

Então, vamos atualizar nosso Dockerfile para:

# Copia package.json e package-lock.json
COPY package*.json ./

# Instala as dependências
RUN npm install
Enter fullscreen mode Exit fullscreen mode

E só então, copiamos o resto dos nossos arquivos:

COPY . .
Enter fullscreen mode Exit fullscreen mode

Então, nossa versão corrigida do Dockerfile será:

FROM node:16

# Cria diretório do aplicativo
WORKDIR /usr/src/app

# Copia package.json e package-lock.json
COPY package*.json ./

# Instala as dependências
RUN npm install

# Copiamos o resto dos arquivos
COPY . .

# Roda o servidor
EXPOSE 8080
CMD [ "node", "server.js" ]
Enter fullscreen mode Exit fullscreen mode

Explicação:

É tudo sobre camadas cacheadas do Docker, ou Docker cached layers.

Cada imagem do Docker consiste de uma série de camadas.

Comandos no seu Dockerfile vão gerar novas camadas.

Ao invés de manter tudo dentro de uma só camada, nós devemos quebrar em partes diferentes.

Pois o Docker sempre vai tentar usar uma camada que já existe, ao invés de criar uma nova, se for possível.

Essa é a explicação simples e rápida.
Você pode ler mais detalhes na documentação oficial.

Conclusão:

Agora, toda vez que modificarmos a package.json, o comando npm install será executado novamente.
Caso não modifiquemos, então essa etapa será simplesmente ignorada.

Você pode verificar esse comportamento no log da imagem, procurando por ---> Using cache, que indica que a pasta node_modules não está sendo reconstruída.

Gostou do post? :D

Se você gostou, por favor considere me seguir ou favoritar esse post!

Top comments (0)