1
resposta

dockerfile - RUN, CMD, ENTRYPOINT

Pessoal, Bom dia.

Estou com dúvida em montar meu dockerfile.

Tenho API construída em NODE/TYPESCRIPT. Estou criando o seguinte DOCKERFILE:

  • FROM node:18
  • ARG NODE_PORT=3001
  • ENV NODE_ENV=production \
  • PORT=NODE_PORT \
  • SECRET=632.....
  • EXPOSE $PORT
  • COPY package*.json ./
  • COPY tsconfig.json ./
  • COPY . .
  • RUN npm install --save typescript && npm install
  • CMD ["npm", "run", "build"]
  • CMD ["npm", "run", "start"]

Primeiro, de maneira simples, li a documentação do docker, mas não me ficou claro o uso de RUN, CMD e ENTRYPOINT. Alguém conseguiria explicar de maneira simplificada?

Segundo, como podem ver:

  1. Em RUN, primeiro faço a instalação do TYPESCRIPT e depois a instalação das dependências do PACKAGE.JSON;
  2. Depois, estou tentando rodar o comando NPM RUN BUILD, que em PACKAGE.JSON, o comando roda um TSC --BUILD;
  3. Por fim, feito o BUILD, gostaria de rodar o NPM RUN START, que executa um NODE ./BUILD/INDEX.JS

Quando faço um build do dokcerfile, a imagem é criada, porém, ao dar run, a imagem não sobe.

Alguém poderia me ajudar?

Obrigado.

1 resposta

Oi Gustavo, tudo bem?

Desculpe a demora em retornar.

A instrução RUN é usada para executar comandos durante a construção da imagem. É útil para instalar pacotes, compilar código, entre outras tarefas. No seu caso, você está usando o RUN para instalar o TypeScript e as dependências do package.json.

A instrução CMD é usada para definir o comando padrão que será executado quando o contêiner for iniciado. Você pode ter apenas uma instrução CMD em seu Dockerfile. No seu caso, você tem duas instruções CMD, o que pode estar causando o problema. A primeira instrução CMD executa o comando "npm run build" e a segunda instrução CMD executa o comando "npm run start".

Uma possível solução para o seu problema é substituir a segunda instrução CMD pela instrução ENTRYPOINT. A instrução ENTRYPOINT é semelhante à instrução CMD, mas ela não pode ser substituída quando o contêiner é iniciado. Ao usar ENTRYPOINT, você pode passar argumentos para o comando definido. No seu caso, você pode usar o ENTRYPOINT para executar o comando "node ./build/index.js" após o build.

Aqui está uma sugestão de como ficaria o seu Dockerfile com as alterações mencionadas:

FROM node:18
ARG NODE_PORT=3001
ENV NODE_ENV=production \
    PORT=$NODE_PORT \
    SECRET=632.....
EXPOSE $PORT
COPY package*.json ./
COPY tsconfig.json ./
COPY . .
RUN npm install --save typescript && npm install
CMD ["npm", "run", "build"]
ENTRYPOINT ["node", "./build/index.js"]

Dessa forma, ao executar o comando "docker run" com a imagem gerada a partir desse Dockerfile, o comando "npm run build" será executado durante a inicialização do contêiner e, em seguida, o comando "node ./build/index.js" será executado.

Espero que essa explicação e sugestão possam te ajudar a resolver o problema.

Um abraço e bons estudos.