Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Usando Volume, Dockerfile e docker-compose.yml para subir uma aplicação Node

Pessoal estou com algumas dúvidas relacionadas a volume:

1 - Desejo subir a aplicação vista na aula de volume, que mostra

Eu amo Docker

na página inicial e que usa Nodejs.

Então essa é a minha imagem:

FROM node
COPY . /var/www
WORKDIR /var/www
RUN npm install
EXPOSE 3000
ENTRYPOINT npm start

e no meu docker.compose.yml:

version: "3"
services: 
    node:
        build: 
            dockerfile: ./Dockerfile
            context: .
        image: node
        container_name: nodejs
        ports:
            - "3000:3000"
        volumes:
            - "./:/var/www"

Como vocês percebem, desejo pelo meu docker-compose.yml usar volumes, para que quando eu altera meu código local, apenas com o "reload" da tela consiga ver as alterações.

No entanto, eu não quero que a pasta node_modules seja tbm copiada da minha máquina local para dentro do meu container, então resolvi excluir com o intuito que ao ser criado o container pelo compose.yml a node_modules seja criada já no meu container . Mas por algum motivo quando fazemos isso, o package.json é copiado, mas o comando npm install não é realizado dentro do container recém criado. Alguém consegue me ajudar com isso ?

2 - Além disso tenho mais outra pergunta relacionada a volume: como posso definir volume direto no meu Dockerfile para que eu tenha esse mapeamento entre pasta local e de dentro do container ? Outra dúvida, quando removemos um container, mesmo com o volume definido, quando subimos novamente um outro container mas com a mesma imagem, os dados mapeados no volume são mapeados novamente pra esse novo container correto ?

3 respostas

Olá Douglas, tudo bem?

1 - Nesse caso, você precisa fazer com que o docker-compose crie automaticamente uma pasta onde possa salvar os arquivos gerados pelo comando npm install, mesmo que você não queira enviar a "node_modules" já com todas as dependências, você deve criar uma pasta fazia para armazenar as dependências que serão geradas já dentro do container, para isso você deve acrescentar um outro volume:

- "./node_modules:/var/www/node_modules"

2 - Depende do volume, você fala em "definir volume direto no Dockerfile", isso é fazendo um mapeamento das pastas? Ou criando realmente um volume? Quanto a remoção, também depende, se um for um volume aleatório será excluído sim, porém se for um build de pasta não. Explica melhor esse ponto 2, ai posso responder mais claramente!

Jonilson, obrigado pela resposta.

Em relação a questão eu só fiquei numa dúvida: Pq eu não posso deixar que o próprio npm start gere a pasta node_modules ?

Já em relação a pergunta dois, eu queria saber se sem utilizar o compose, se eu consigo criar volumes no Dockerfile. No caso, vejamos esse meu exemplo da pergunta 1, eu defino os volumes no docker-compose.yml, porém eu consigo fazer isso só no Dockerfile e como ?

A outra pergunta, vou tentar explicar melhor com um exemplo:

Suponhamos que tenhamos um container de banco de dados, e salvamos esses dados em um volume e seus logs. Porém, supondo que eu acesso o meu servidor e faço um docker-compose down removendo o meu containerde BD. Nesse caso, tenho os dados salvos no servidor, no host. Caso eu rode um docker-compose up novamente para subir esse banco de dados, ao acessar o novo container gerado, esses dados salvos estarão nesse meu novo container ?

solução!

Sobre "Porque eu não posso deixar que o próprio npm start gere a pasta node_modules", isso é porque dentro do container o npm start não cria a pasta node_modules, quem faz isso é o npm install, que instala todas as dependências. O npm start apenas inicializa o projeto, ou seja o "server".

Sobre a sua segunda pergunta, sim, é possível, desde que a pasta que é o volume no servidor, na máquina real não seja apagada e o container suba usando a mesma como volume.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software