3.1 Instrução FROM
Então, só relembrando, Dockerfile é um arquivo de texto que contém instruções pra criar uma imagem Docker. Cada instrução no Dockerfile realiza uma tarefa específica e cria uma nova camada na imagem. Nessa aula, a gente vai dar uma olhada mais detalhada nas instruções principais do Dockerfile: FROM
, RUN
, COPY
e CMD
, que são cruciais pra criar imagens Docker funcionais e eficientes.
A instrução FROM
define a imagem base, a partir da qual uma nova imagem será criada. É a primeira instrução em qualquer Dockerfile e determina o ponto inicial pra construção da imagem.
Sintaxe
FROM <image>[:<tag>] [AS <name>]
Onde:
<image>
: nome da imagem base.<tag>
: (opcional) versão da imagem base. O padrão élatest
.AS <name>
: (opcional) define um nome pra essa etapa da construção (usado em construção de múltiplas etapas).
Exemplos
Usando a imagem base Ubuntu
:
FROM ubuntu:20.04
Usando a imagem oficial do Node.js
:
FROM node:14
Usando construção de múltiplas etapas pra otimização:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Nesse exemplo, são usadas duas imagens base. A primeira (node:14) é usada pra construir o aplicativo, e a segunda (nginx:alpine) serve pra criar um servidor leve que vai servir arquivos estáticos.
Graças à construção de múltiplas etapas, a imagem final contém apenas o conjunto mínimo de arquivos e programas (neste caso Nginx
e os arquivos estáticos construídos), tornando-a mais leve e rápida de implantar.
3.2 Instrução RUN
A instrução RUN
executa comandos dentro do container e cria uma nova camada na imagem. Essa instrução é usada pra instalar pacotes, configurar o ambiente e executar outros comandos necessários pra preparar a imagem.
Sintaxe:
RUN <command>
Onde:
<command>
: o comando que será executado dentro do container.
Exemplos:
Instalar pacotes na imagem do Ubuntu:
RUN apt-get update && apt-get install -y curl git
Compilar código:
RUN gcc -o myapp myapp.c
Combinando vários comandos
Pra reduzir o número de camadas, diminuir o tamanho da image
e acelerar a construção, é recomendado combinar vários comandos em uma única instrução RUN
.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Instrução COPY
A instrução COPY
copia arquivos e diretórios do contexto de construção para o sistema de arquivos do container. Isso é útil para mover o código-fonte, arquivos de configuração e outros recursos para o container.
Sintaxe:
COPY <src> <dest>
Onde:
-
<src>
: caminho para os arquivos ou diretórios no contexto de construção. <dest>
: caminho de destino no container.
Exemplos:
Copiar todo o conteúdo do diretório atual para o diretório de trabalho do container:
COPY . /app
Copiar arquivos individuais:
COPY package.json /app/package.json
COPY server.js /app/server.js
Usando .dockerignore
Para excluir arquivos desnecessários do processo de cópia, você pode usar o arquivo .dockerignore
, que funciona de forma semelhante ao .gitignore
.
node_modules
dist
*.log
3.4 Instrução CMD
A instrução CMD
define o comando que será executado ao iniciar o container. Diferente do RUN
, que é executado no estágio de build, o CMD
é executado ao iniciar o container a partir da imagem criada.
Sintaxe:
CMD ["executable","param1","param2"]
Ou
CMD command param1 param2
Onde:
- ["executable","param1","param2"]: forma exec, que é preferível para garantir um tratamento adequado de sinais.
- command param1 param2: forma
shell
, que executa o comando no shell.
Exemplos:
Rodando uma aplicação Node.js
:
CMD ["node", "app.js"]
Rodando um script shell
:
CMD /usr/bin/myscript.sh
Diferença entre CMD
e ENTRYPOINT
CMD
define um comando padrão que pode ser sobrescrito ao iniciar o container. ENTRYPOINT
define um comando fixo que será sempre executado ao iniciar o container.
Exemplo de uso do ENTRYPOINT
:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
Nesse exemplo, o ENTRYPOINT
roda o script Python, enquanto o CMD
passa os argumentos que podem ser alterados ao iniciar o container.
Exemplo de Dockerfile com instruções principais
# Usando a imagem base do Node.js
FROM node:14
# Definindo o diretório de trabalho
WORKDIR /app
# Copiando os arquivos package.json e package-lock.json
COPY package*.json ./
# Instalando as dependências
RUN npm install
# Copiando o código fonte da aplicação
COPY . .
# Definindo a porta que será usada pela aplicação
EXPOSE 3000
# Definindo o comando para rodar a aplicação
CMD ["node", "app.js"]
GO TO FULL VERSION