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:
ARG
está disponível apenas durante o processo de construção da imagem e não afeta o contêiner resultante. Em contraste,ENV
define variáveis de ambiente que persistem durante a execução do contêiner. - Substituição:
ENV
pode ser sobrescrito no momento de execução do contêiner com o comandodocker run -e
, enquantoARG
pode 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
ARG
para 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
ENV
para 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
ARG
eENV
para Máxima Flexibilidade: Para um Dockerfile altamente dinâmico, combineARG
eENV
, 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
ARG
eENV
para 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.
Add Comment