Nesse texto, vou compartilhar minhas anotações sobre as principais instruções (comandos) de um Dockerfile. Eu uso esses comandos no meu dia a dia para criar meus containers e rodar uma app!
Vamos lá:
ADD
Copia arquivos, diretórios, arquivos TAR ou arquivos remotos (pode ser de uma URL, como se fosse o comando wget no Linux) e os adiciona ao filesystem do container.
COPY
Copia novos arquivos e diretórios, adicionando-os ao filesystem do container. Eu uso para adicionar os códigos da app no meu container, quando necessário, dessa maneira:
Eu baixo o repositório através do git pull e copio os arquivos assim:
COPY ./path /path-da-pasta-dentro-do-container
O ponto depois do COPY significa diretório local. Nesse caso, ele adiciona todos os arquivos do diretório que você está para dentro do container.
Opa, mas pera lá: qual a diferença entre COPY e ADD?
Basicamente, são duas:
- A origem do
ADDpode ser uma URL, enquanto oCOPYprecisa ser através do filesystem. - O
ADDpode copiar um arquivo com formato de compressão conhecido e ele será descomprimido automaticamente.
Porém, a própria Docker recomenda o uso do COPY ao invés do ADD.
Futuramente, terá um texto sobre as melhores práticas do Dockerfile! #FiqueLigado
RUN
Executa qualquer comando em uma nova camada no topo da imagem (aquela camada Copy-on-Write que mencionei no último texto) na hora do build da imagem. É interessante usar para instalar todos os pacotes, bibliotecas e programas necessários para que sua aplicação funcione.
CMD
Executa um comando após o build da imagem. Diferente do RUN, que executa o comando no momento em que está “buildando” a imagem, o CMD executa no início da execução do container.
Exemplo:
CMD ["./script.sh"]
Existem outras formas de escrever o CMD, mas eu sempre sigo essa que fica mais fácil para decorar e usar:
CMD ["executável", "param1", "param2"]
Essa forma é conhecida como exec form e, conforme a documentação da Docker, é a mais recomendável!
ENTRYPOINT
Permite você configurar um container para rodar um executável, e quando esse executável for finalizado, o container também será. É como se transformássemos um container em um executável.
Eita! Qual a diferença entre CMD e ENTRYPOINT?
Basicamente, pelo que estudei, não existem muitas diferenças. Recomendo você a usar o ENTRYPOINT, baseado nesse texto aqui de um Docker Captain informando que o ideal é usar ENTRYPOINT ao invés do CMD.
LABEL
Adiciona metadados à imagem, como por exemplo, versão da app, descrição e fabricante. Deve ser utilizado assim:
LABEL ImageName=Ubuntu App=Frontend
ENV
Informa variáveis de ambiente ao container.
EXPOSE
Informa qual porta o container estará ouvindo.
FROM
Indica qual imagem será utilizada como base. Ela precisa ser a primeira linha do Dockerfile.
MAINTAINER
Geralmente é escrito o nome e o e-mail do autor da imagem. Essa instrução foi descontinuada, mas você ainda pode ver por aí.
USER
Determina qual o usuário será utilizado na imagem. Por padrão, é o root.
VOLUME
Permite a criação de um ponto de montagem no container. Esse cara merece um texto específico para ele, então #FiqueLigado2
WORKDIR
Responsável por mudar do diretório / (raiz) para o especificado nessa instrução, por exemplo:
WORKDIR /path-da-app
HEALTHCHECK
Essa instrução é um jeito de verificar se o container está funcionando. Confesso que atualmente não utilizo muito — monitoro o health de um container de outras maneiras. Um exemplo:
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http://localhost/ || exit 1
Esses são os principais “comandos” que uso para escrever um Dockerfile. Você pode encontrar todos na documentação oficial.