1
resposta

Aos colegas fazendo o curso em 2021, encontrei os seguintes pontos

Este post não é uma duvida, apenas um compartilhamento das dificuldades e soluções que enfrentei e encontrei até a aula 04.01 (Construindo nossas proprias imagens/Criando um Dockerfile) do curso de docker (Docker: Criando containers sem dor de cabeça)

Este post visa ajudar a resolver os seguintes problemas:

  • MAINTAINER - Deprecated
  • Erro ao copiar arquivo
  • Falta do Package.json no build
  • Container não inicia
  • Container inicia e para
  • Docker run não acha o arquivo index
  • Alterar TAG da Imagem
  • Access denied no DOCKER PUSH
  • Problema no DOCKER PUSH

Estou fazendo o curso em um Ubuntu 20.04 recem instalado. Minha pasta volume-exemplo está em:

/home/USUARIO/www/volume-exemplo

Estou rodando os comandos como root e a partir desta pasta.

Esse era o Dockerfile proposto na aula. (se não estou enganado)

FROM node:latest
MAINTAINER _MEU_NOME_
COPY . /var/www
WORKDIR /var/wwww
RUN npm install
ENTRYPOINT [ "npm", "start" ]
EXPOSE 3000

O primeiro ponto é que MAINTAINER esta deprecated, fora de uso. Então substitui por:

FROM node:latest
LABEL maintainer="__SEU_NOME__"
COPY . /var/www
WORKDIR /var/wwww
RUN npm install
ENTRYPOINT [ "npm", "start" ]
EXPOSE 3000

Segundo ponto, quando executava ele me dava um erro dizendo que não achava o package.json, descobri que a copia estava falhando. Alterei para copiar "na marra" o package.json

FROM node:latest
LABEL maintainer="__SEU_NOME__"
COPY ./ /var/www
WORKDIR /var/wwww
COPY package*.json .
RUN npm install
ENTRYPOINT [ "npm", "start" ]
EXPOSE 3000

Parecia que tudo estava OK, mas não registrava o container com meu nome e não iniciava.

Sobre o registro do nome resolvi deixando só o nome, sem a tag. Desta forma ele registra o NOME como repository e a tag como LATEST

docker build -f Dockerfile -t NOME .

Eu dava o comando para rodar, parecia que iniciava e desligava. Dava "docker ps" e nada, só no "docker ps -a" via o container, Então fui atras do log

docker log ID_DO_CONTAINER

E analisando o log vi que ele dizia não ter achado o arquivo INDEX. Logo me veio a questão: "Será que ele esta copiando tudo ou falhando como no caso do package?".

Então resolvi separar os comandos. Primeiro criar o diretorio, depois copiar os arquivos.

FROM node:latest
LABEL maintainer="_NOME_"
ENV NODE_ENV=production
ENV PORT=3000
RUN mkdir -p /var/www
WORKDIR /var/wwww
COPY ./* ./
RUN npm install
ENTRYPOINT npm start
EXPOSE $PORT
  1. Comando FROM para pegar a imagem de referencia
  2. Seto a variavel de ambiente para production (como na aula)
  3. Seto a variavel de ambiente PORT para 3000 (como na aula)
  4. MANDO CRIAR A PASTA "/var/www" na MARRA!
  5. SETO o WORKDIR para a pasta que criei
  6. Depois da pasta existir, copio os arquivos.
  7. Dou um NPM INSTALL
  8. Seto o ponto de entrada do container
  9. exponho a porta da variavel de ambient.

Desta forma consegui rodar o comando de build sem problemas:

/home/MEU_USUARIO/www/volume-exemplo# docker build -f Dockerfile -t NOME .

(Atenção ao final deste post, há uma forma melhor de fazer o build)

e então executar o container:

docker run -d -p 80:3000 NOME

Quando fui rodar o comando da proxima aula (# docker push) não conseguia enviar, dava um erro de access denied. Então solucionei alterando a tag da imagem, fazendo logout, login e reenviando.

Alterando a TAG

docker tag TAG_DO_CONTAINER USUARIO_DOCKERHUB/REPOSITORY:NOVA_TAG

Fazendo LOGOU

docker logout

Fazendo login

docker login

Mas se na hora de dar um BUILD você já seguir o padrão, não terá problemas na proxima aula:

docker build -f Dockerfile -t USUARIO_DOCKERHUB/REPOSITORY:TAG .

Poderá então fazer o push sem problemas:

docker push USUARIO_DOCKERHUB/REPOSITORY:TAG

E poderá rodar sua imagem com o comando:

docker run -d -p PORTA:3000 USUARIO_DOCKERHUB/REPOSITORY:TAG

Espero que este relato ajude aos colegas.

Att. MChapela.

1 resposta

Valeu Mario, obrigado pelas dicas