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

Como obter a estrutura do projeto a partir de uma imagem baixada?

Seguindo o capitulo 4 construí minha imagem e coloquei no Docker Hub.

Para efeito de teste eu apaguei meu volume local, mas fiz um bkp, tentei construir um novo container a partir da imagem do Docker Hub simulando o comportamento de passar o projeto para alguém.

Tentei executar: docker run -p 8080:3000 -v "C:\Users\shun\Desktop\volume- exemplo:/var/www" -w "/var/www" rocklee6544/node npm start

Para minha surpresa nenhum arquivo do projeto foi baixado no volume local , alguém sabe me dizer se isso é normal?

No entanto se eu apenas rodar o comando : docker run -d -p 8080:3000 rocklee6544/node npm start tudo funciona normalmente, meu container é criado e os arquivos estão lá, mas apenas dentro do meu container.

9 respostas

Outro teste que fiz foi : docker start c070183c85a4 (id do container) e docker exec -i -t c070183c85a4 /bin/bash

Em outra aba do power shell, eu usei o comando cp e funciona: docker cp c070183c85a4:/var/WWW/. C:\Users\shun\Desktop\teste

Com isso eu consegui copiar todos os arquivos do meu container para meu Docker Host.

Fala João, tranquilo?

Posso dar uma olhada no Dockerfile dessa imagem?

Claro :

FROM node:latest 
MAINTAINER João Henrique Sewaybrick
ENV PORT=3000
COPY . /var/WWW
WORKDIR /var/WWW
RUN npm install
ENTRYPOINT ["npm", "start"] 
EXPOSE $PORT

O que ele reclama é da falta do arquivo package.json na minha pasta, o conteúdo que apaguei de propósito para ver se ele baixa de novo a partir da imagem do Docker Hub.

docker run -p 8080:3000 -v "C:\Users\shun\Desktop\volume- exemplo:/var/www" -w "/var/www" rocklee6544/node npm start

docker run -p 8080:3000 -v "C:\Users\shun\Desktop\volume-exemplo:/var/www" -w "/var/www" rocklee6544/node npm start                                                                                 npm ERR! path /var/www/package.json
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open '/var/www/package.json'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2019-08-30T20_53_55_896Z-debug.log

Então João, temos dois problemas aí:

O primeiro:

Em seu Dockerfile as seguintes instruções foram especificadas:

COPY . /var/WWW
WORKDIR /var/WWW

Logo, seu WORKDIR e os arquivos foram copiados para a pasta /var/WWW (com W maiúsculo). Trocando para /var/www deve resolver parcialmente o problema.

Como no seu Dockerfile já foi definido o WORKDIR e seu ENTRYPOINT, não é necessário ao executar o container passar a flag -w /var/www e passar o npm start como parâmetro, já que ele foi definido no ENTRYPOINT.

Bastando executar (até então) o seguinte trecho:

docker run -p 8080:3000 -v "C:\Users\shun\Desktop\volume-exemplo:/var/www" rocklee6544/node

Agora vem um problema um pouco mais complexo:

Ao utilizar a flag -v "C:\Users\shun\Desktop\volume-exemplo:/var/www"

O seu container está utilizando a pasta C:\Users\shun\Desktop\volume-exemplo como volume e montando uma referência para a pasta /var/www. Mas o que acontece nesse momento? O Docker ao inicializar o volume, joga o conteúdo da pasta que está na sua máquina host dentro da pasta do container, deixando ela vazia.

Para resolver esse problema, basta inicializar o volume do seguinte modo:

docker run -p 8080:3000 -v "var/www" rocklee6544/node

Sem passar o primeiro parâmetro, o Docker criará um volume com identificador aleatório em sua máquina no momento que subir o container, ou seja, não esvaziará sua pasta.

Uma última observação é que as aspas não são necessárias, deixando o comando mais limpo:

docker run -p 8080:3000 -v var/www rocklee6544/node `

Sacou? Se ficou confuso me avisa que te explico novamente :)

solução!

Muito obrigado pela dica:

O que foi feito:

1 - Configurei minha imagem do node através do: jsewaypricknode.dockerfile

2 - Executei o build dessa imagem através do: docker build -f jsewaypricknode.dockerfile -t rocklee6544/node .

3 - docker login

4 - docker push rocklee6544/node

5 - Parei e removi meu container:docker rm -f rocklee6544/node

6- Limpei minha pasta volume-exemplo

7- docker image rm rocklee6544/node

8 - Baixei do Docker Hub a imagem : docker pull rocklee6544/node

Nesse ponto eu fiz dois testes:

1 - Subi o container do node do jeito que estava : docker run -d -p 8080:3000 rocklee6544/node e depois docker rm -f rocklee6544/node

2- Tentei referenciar minha pasta volume-exemplo novamente ao meu container e esperava que os arquivos do container fossem baixado para a pasta volume-exemplo.

` PS C:\Users\shun> docker exec -it c070183c85a4 /bin/bash root@c070183c85a4:/var/WWW# ls

index.html index.js jsewaypricknode.dockerfile main.css node_modules package-lock.json package.json

root@c070183c85a4:/var/WWW# `

Eu gostaria de a partir da imagem do Docker Hub subir o container e a partir desse container baixar código na minha máquina (igual é feito por exemplo com o git hub) já fazendo a referencia .

Só consegui fazer isso usando o comando CP na unha: 1 - Baixei a imagem 2 - Criei o container 3 - copiei os dados do container : docker cp c070183c85a4:/var/WWW/. C:\Users\shun\Desktop\volume-exemplo 4- apaguei esse container 5-Criei um novo usando -v

Que bom que resolveu, conseguiu sacar as paradas que te falei? :)

Sim entendi, a referência é uma via de mão dupla portanto de certa forma perigosa e o dockerfile já continha o comando start, muito obrigado pelas dicas.

A minha intenção era baixar o conteúdo do projeto na minha máquina a partir de uma imagem que eu mesmo criei no Docker Hub.

Quando monto o container a partir da imagem os arquivos do projeto estão dentro do container apenas e não existe uma relação entre o container e a pasta do host nesse caso.

Por esse motivo eu não conseguiria fazer refletir qualquer alteração da pasta do host no container e mesmo tendo feito essa ligação de forma manual meus dados no container se mantiveram intactos.

Estava com esperança que ao baixar a imagem e criar o container o volume seria automaticamente montado já com o código do projeto junto.

Seria +- o cenário de ter o projeto configurado na minha máquina e passar para alguém da equipe começar a trabalhar nesse mesmo projeto sem precisar configurar nada, com docker funciona, mas ainda assim o fonte fica no container dentro do docker.

Tudo esclarecido então? Posso fechar o tópico? :)

Oi João, tudo bem?

Como seu problema foi solucionado, estou fechando o tópico, ok?

Qualquer coisa não hesite em abrir outro :)