Para fazer a criação de um dockerfile, é um processo bem simples.

Então, no nosso projeto, devemos criar o arquivo Dockerfile, que nada mais é do que um arquivo de texto. Ele pode ter qualquer nome, porém nesse caso ele também deve possuir a extensão .dockerfile, por exemplo node.dockerfile, mas vamos manter o nome padrão mesmo.

Geralmente, montamos as nossas imagens a partir de uma imagem já existente. Nós podemos criar uma imagem do zero, mas a prática de utilizar uma imagem como base e adicionar nela o que quisermos é mais comum. Para dizer a imagem-base que queremos, utilizamos a palavra FROM mais o nome da imagem.

Como o nosso projeto precisa do Node.js, vamos utilizar a sua imagem:

FROM nodeCOPIAR CÓDIGO

Além disso, podemos indicar a versão da imagem que queremos, ou utilizar o latest, que faz referência à versão mais recente da imagem. Se não passarmos versão nenhuma, o Docker irá assumir que queremos o latest, mas vamos deixar isso explícito:

FROM node:latestCOPIAR CÓDIGO

Outra instrução que é comum colocarmos é quem cuida, quem criou a imagem, através do MAINTAINER:

FROM node:latest
MAINTAINER André luis

Agora, especificamos o que queremos na imagem. No caso, queremos colocar o nosso código dentro da imagem, então utilizarmos o COPY. Como queremos copiar tudo o que está dentro da pasta, vamos utilizar o . para copiar tudo que está na pasta do arquivo Dockerfile, e vamos copiar para /var/www, do exemplo da aula anterior:

FROM node:latest
MAINTAINER André luis
COPY . /var/www

No projeto, já temos as suas dependências dentro da pasta node_modules, mas não queremos copiar essa pasta para dentro do container, pois elas podem estar desatualizadas, quebradas, então queremos que a própria imagem instale as dependências para nós, rodando o comando npm install. Para executar um comando, utilizamos o RUN:

FROM node:latest
MAINTAINER André luis
COPY . /var/www
RUN npm install

Agora, deletamos a pasta node_modules, para ela não ser copiada para o container. Além disso, toda imagem possui um comando que é executado quando a mesma inicia, e o comando que utilizamos na aula anterior foi o npm start. Para isso, utilizamos o ENTRYPOINT, que executará o comando que quisermos assim que o container for carregado:

FROM node:latest
MAINTAINER André luis
COPY . /var/www
RUN npm install
ENTRYPOINT npm start

Também podemos passar o comando como se fosse em um array, por exemplo ["npm", "start"], ambos funcionam.

Falta colocarmos a porta em que a aplicação executará, a porta em que ela ficará exposta. Para isso, utilizamos o EXPOSE:

FROM node:latest
MAINTAINER André luis
COPY . /var/www
RUN npm install
ENTRYPOINT ["npm", "start"]
EXPOSE 3000

Por fim, falta dizermos onde os comandos rodarão, pois eles devem ser executados dentro da pasta /var/www. Então, através do WORKDIR, assim que copiarmos o projeto, dizemos em qual diretório iremos trabalhar;