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
- Comando FROM para pegar a imagem de referencia
- Seto a variavel de ambiente para production (como na aula)
- Seto a variavel de ambiente PORT para 3000 (como na aula)
- MANDO CRIAR A PASTA "/var/www" na MARRA!
- SETO o WORKDIR para a pasta que criei
- Depois da pasta existir, copio os arquivos.
- Dou um NPM INSTALL
- Seto o ponto de entrada do container
- 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.