O Dockerfile é uma ferramenta poderosa para definir e automatizar a criação de ambientes de execução para aplicações. Dois dos comandos mais úteis para tornar seus Dockerfiles mais flexíveis e configuráveis são ARG e ENV. Neste artigo, vamos explorar como usar essas instruções para criar imagens Docker dinâmicas e configuráveis.
O Que São ARG e ENV?
ARG e ENV são variáveis que podem ser definidas no Dockerfile para configurar o comportamento de sua imagem e contêiner. Ambos permitem a passagem de valores, mas têm usos e comportamentos distintos:
- ARG (Argumento): Utilizado para definir variáveis durante o build da imagem. Essas variáveis só estão disponíveis durante a construção da imagem e não persistem no contêiner resultante.
- ENV (Variável de Ambiente): Utilizado para definir variáveis de ambiente que persistem e estão disponíveis durante a execução do contêiner.
Como Usar ARG no Dockerfile
O comando ARG define variáveis que podem ser passadas para o Docker durante o processo de build. Essas variáveis são úteis quando você deseja parametrizar aspectos da construção da imagem.
Exemplo de Uso do ARG:
# Definindo um ARG com valor padrão
ARG VERSION=latest
# Usando o ARG para especificar a versão de uma imagem base
FROM ubuntu:${VERSION}
# Executando comandos com base no ARG
RUN apt-get update && apt-get install -y software-properties-common
# Adicionando mais pacotes específicos para a versão
RUN add-apt-repository ppa:deadsnakes/ppa \
&& apt-get install -y python3.8
Neste exemplo, o ARG VERSION=latest define uma variável VERSION que, por padrão, assume o valor “latest”. Se você deseja construir a imagem com uma versão específica do Ubuntu, pode passar essa versão no momento de build:
docker build --build-arg VERSION=20.04 -t my-ubuntu-image .
Isso permite flexibilidade na escolha da versão da imagem base sem precisar modificar o Dockerfile diretamente. Essa abordagem é especialmente útil quando você deseja criar diferentes versões da sua aplicação ou testar compatibilidade com diferentes ambientes.
Como Usar ENV no Dockerfile
A instrução ENV define variáveis de ambiente que estarão disponíveis tanto durante o processo de construção da imagem quanto na execução do contêiner. Essas variáveis são úteis para configurar a aplicação dentro do contêiner, como definir caminhos, chaves de API, ou qualquer outra configuração que sua aplicação necessite.
Exemplo de Uso do ENV:
# Definindo uma variável de ambiente
ENV APP_HOME=/usr/src/app
# Usando a variável de ambiente
WORKDIR $APP_HOME
# Copiando arquivos para o diretório de trabalho
COPY . .
# Definindo outra variável de ambiente
ENV PORT=8080
# Executando a aplicação
CMD ["python3", "app.py"]
Neste exemplo, o ENV APP_HOME=/usr/src/app define um diretório de trabalho para a aplicação. A variável APP_HOME é usada posteriormente com o comando WORKDIR para definir onde os arquivos serão copiados e onde o processo da aplicação será executado.
O ENV PORT=8080 define a porta na qual a aplicação será executada. Essa variável pode ser utilizada pelo código da aplicação para determinar em qual porta o servidor deve escutar.
Aprendendo na prática
Diferenças Entre ARG e ENV
Embora ambos permitam a definição de variáveis, existem diferenças fundamentais entre ARG e ENV:
- Escopo de Aplicação:
ARGestá disponível apenas durante o processo de construção da imagem e não afeta o contêiner resultante. Em contraste,ENVdefine variáveis de ambiente que persistem durante a execução do contêiner. - Substituição:
ENVpode ser sobrescrito no momento de execução do contêiner com o comandodocker run -e, enquantoARGpode ser sobrescrito apenas durante a construção com o comandodocker build --build-arg. - Segurança: Como
ARGé usado apenas durante o build, ele é mais seguro para definir valores sensíveis que não devem estar disponíveis no contêiner final. No entanto, para segurança adicional, é recomendável utilizar ferramentas especializadas para gerenciar segredos.
Combinando ARG e ENV
Você pode usar ARG e ENV juntos para criar uma imagem altamente configurável. Por exemplo, você pode usar um ARG para definir um valor padrão durante o build, que pode ser substituído por um ENV na execução do contêiner:
Exemplo Combinado:
# Definindo um ARG com valor padrão
ARG APP_PORT=3000
# Definindo uma variável de ambiente com base no ARG
ENV PORT=${APP_PORT}
# Usando a variável de ambiente
EXPOSE $PORT
# Comando para executar a aplicação
CMD ["node", "server.js"]
Neste exemplo, o ARG APP_PORT=3000 define a porta padrão durante o build. Essa porta é então passada para o ENV PORT, que será utilizada para expor a porta no contêiner. Esse valor pode ser sobrescrito tanto durante o build quanto durante a execução.
Boas Práticas ao Usar ARG e ENV
- Use
ARGpara Parametrizar Builds: Se você precisa de flexibilidade no processo de construção da imagem, utilizeARG. Isso permite que você reutilize o mesmo Dockerfile para diferentes versões ou configurações. - Utilize
ENVpara Configurações Dinâmicas:ENVé ideal para definir configurações que podem variar entre ambientes de desenvolvimento, teste e produção. Permite também que essas variáveis sejam facilmente sobrescritas em tempo de execução. - Combine
ARGeENVpara Máxima Flexibilidade: Para um Dockerfile altamente dinâmico, combineARGeENV, permitindo que as variáveis sejam configuradas tanto no build quanto na execução. - Evite Hardcoding: Em vez de codificar valores diretamente no Dockerfile, utilize
ARGeENVpara definir valores configuráveis, tornando suas imagens mais flexíveis e fáceis de manter.
Conclusão
ARG e ENV são instruções poderosas no Dockerfile que oferecem uma maneira eficiente de tornar suas imagens Docker mais dinâmicas e configuráveis. Compreender as diferenças e saber quando usar cada uma delas permitirá que você crie ambientes de contêiner mais robustos, flexíveis e fáceis de adaptar a diferentes cenários. Ao seguir as práticas recomendadas, você pode garantir que seu Dockerfile seja eficiente e que suas aplicações rodem de forma consistente, independentemente do ambiente.


