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

[Dúvida] Por que o run falhou na primeira tentativa?

Tive um erro ao executar um contêiner. Consegui resolver refazendo o build, mas não entendi o porquê. Gostaria de entender melhor o que aconteceu.

Na parte 3 da aula 3 do Curso de Docker, fiz o build da imagem conforme instruído:

murilo in TrustedRepos/Docker/node-app-example 
➜  docker build -t muriloloffi/app-node:1.0 .
[+] Building 23.7s (10/10) FINISHED
(...)

Na reticências acima (...), não há nenhum erro ou warning no output, por isso abreviei.

No entanto, ao instanciar um contêiner desta imagem, o Docker reclama que não consegue encontrar o npm start nos caminhos definidos em $PATH do ambiente conteinerizado.

murilo in TrustedRepos/Docker/node-app-example 
➜  docker run -d -p 3000:3000 muriloloffi/app-node:1.0
62fbd49091c5c3dc5f659906fce396c1aae589b3d8e16d0e00c071d48c617186
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "npm start": executable file not found in $PATH: unknown.

A solução foi simplesmente re-executar o mesmo comando de build, mas não ficou claro o porquê. Alguém saberia explicar?


A fim de melhor contextualizar, segue o conteúdo da pasta e o Dockerfile:

Pasta:

murilo in TrustedRepos/Docker/node-app-example took 22,2s 
➜  ls
Dockerfile  index.html  index.js  main.css  node_modules  package.json

Dockerfile:

# Define a base da imagem
FROM node:18

# Define o diretório padrão, onde os comandos serão executado. Torna-se o "." do contêiner.
WORKDIR /app-node

# Copia o contéudo a ser conteinerizado para dentro do contêiner. Neste caso, o que está sendo conteinerizado é a uma aplicação node, na pasta do projeto atual "." para o diretório padrão do contêiner "."; Caso um diretório padrão do contêiner não tenha sido especificado, pode-se passar o nome do diretório de destino dentro do contêiner como segundo parâmetro do comando COPY. Por exemplo: COPY . /app-node
COPY . .

# Comando a ser executado na criação do contêiner
RUN npm install

# Processo que, enfim, ficará executando no isolamento do contêiner.
ENTRYPOINT npm start% 
2 respostas
solução!

Olá Murilo!

Quando você realiza o comando docker build, o Docker cria a imagem em camadas, e cada instrução no Dockerfile cria uma nova camada. O Docker usa cache para acelerar o processo de build quando as instruções não mudaram. No entanto, às vezes, isso pode levar a situações onde mudanças não são detectadas corretamente, ou onde o cache não reflete o estado atual desejado dos arquivos ou dependências.

No seu caso, como o comando npm start não foi encontrado inicialmente, pode ser que, durante o primeiro build, a instalação das dependências do Node.js (npm install) não tenha sido completada corretamente ou que o diretório de trabalho (WORKDIR /app-node) não tenha sido configurado corretamente antes de copiar os arquivos e executar o npm install. Isso poderia explicar por que o npm start não estava disponível no $PATH.

Ao refazer o build, você forçou o Docker a refazer essas camadas, possivelmente corrigindo qualquer problema de cache ou de estado inconsistente que poderia ter ocorrido na primeira tentativa.

Como prática recomendada, você pode usar a opção --no-cache ao fazer o build para garantir que todas as camadas sejam recriadas sem usar o cache, especialmente se você encontrar problemas estranhos como esse. Aqui está como você poderia fazer isso:

docker build --no-cache -t muriloloffi/app-node:1.0 .

Isso garante que todos os passos sejam executados como se fosse a primeira vez, evitando quaisquer problemas relacionados ao cache.

Bons estudos!

Excelente! Obrigado, Lucas!