Docker
  • Introdução a Containeres e Docker
    • Introdução
    • O que é um container e suas vantanges
    • VM versus Container
    • Como funcionam os containers
    • Linux
    • Container sem Docker
      • cgroup
      • cpu.max
    • LxC
    • LxD
    • Containers versus Imagens
    • Arquitetura do Docker
    • Arquitetura do Docker mais a fundo
    • Projetos Open Source
  • Instalação do Docker
    • Linux
    • Windows
      • Docker Desktop
      • Rancher Desktop
      • WSL
    • Mac
    • Visual Studio Code
  • Primeiros Passos com Docker
    • Criação e listagem básica de um container
    • Interagindo com o container
    • Executando containers continuamente
      • nginx
      • docker container run
      • docker container run nginx
      • docker container run -d nginx
      • docker container exec
    • Como usar publish de porta
      • docker container stop
      • docker container start
      • docker container rm
      • docker container rm -f $(docker container ls -qa)
    • Containers e variáveis de ambiente
      • docker container run -e
  • Desafio
    • Desafio 01 - Banco de Dados Postgresql
    • Desafio 02 - Banco de Dados MySQL
    • Desafio 03 - Banco de Dados MongoDB
  • Executando a sua primeira aplicação em containers
    • Introdução
    • Preparando o container para a aplicação
    • Executando a aplicação
      • docker container cp
  • Primeiros Passos com Docker Images
    • Introdução
    • OverlayFS na Prática
    • Copy-on-Write
    • Formas de criar uma imagem Docker
    • Como funciona o Docker Commit
    • Docker Commit na Prática
      • docker commit
    • Entendendo melhor a sua imagem
      • docker image history
      • docker image inspect
    • Entrando mais a fundo na imagem
    • Como usar a imagem Docker no modo raiz
  • Avançando em imagens Docker com Dockerfile
    • O que é Dockerfile
    • Primeira Imagem com Dockerfile
      • docker image build
    • Como funciona a construção com Dockerfile
    • Possibilidades com Dockerfile
    • FROM
    • RUN
    • WORKDIR
    • COPY
    • ADD
    • LABEL
    • ENV
    • VOLUME
    • ARG
    • EXPOSE
    • USER
    • ENTRYPOINT
    • CMD
    • ENTRYPOINT versus CMD
    • Principais comandos com imagem
    • Imagem da aplicação com Dockerfile
    • Comparando Docker Commit com Dockerfile
  • Docker Registry
    • Introdução
    • Docker Hub
    • Sua imagem com o nome certo
    • Renomear imagens com Docker Tag
      • docker image tag
    • Enviando a sua primeira imagem para o Docker Hub
      • docker image push
      • docker image pull
  • Algumas boas práticas para construção de imagem
    • Um processo por container
    • Usar imagens confiáveis
    • Otimizar sempre a sua imagem
    • Uso inteligente das camadas
    • Dockerignore
  • Multistage Build
    • Introdução
    • Multistage build na prática
    • Target para fazer o build
      • docker image build --target
    • Imagem externa no Multistage build
    • Usar um estágio de build como base
  • Docker Volume
    • Introdução
      • docker volume
    • Bind Mount
    • Particularidades do Bind Mount
    • Bind Mount no Windows
    • Exemplo com Bind Mount
    • Docker Volume
      • docker volume create
      • docker volume inspect
      • docker volume ls
      • docker volume prune
      • docker volume rm
    • Onde ficam os arquivos do Docker volume?
    • Usando o volume no Dockerfile
    • Como fazer backup de um Docker Volume
    • Exemplo com Docker Volume
    • Storage tmpfs
    • Como criar algo funcional com o que aprendemos
  • Network
    • Introdução
    • Componentes do Docker Network
    • Rede Bridge na prática
      • docker network
      • docker network create
      • docker network inspect
      • docker network ls
      • docker network prune
      • docker network rm
    • Criando a sua rede bridge
      • docker network connect
      • docker network disconnect
    • Como funciona a rede bridge por dentro
    • Rede Host na prática
    • Rede none da prática
    • Como adicionar domínios no seu container
  • Aplicação 100% no Docker
    • Introdução
    • Criação da Imagem e Envio para o Docker Hub
    • Criação do Docker Network
    • Container do PostgreSQL
    • Container da Aplicação Web
    • Atualização da aplicação
  • Docker Compose
    • Introdução
      • docker compose
    • A evolução do docker compose
    • Criação básica de um Docker Compose
      • docker compose attach
      • docker compose build
      • docker compose config
      • docker compose cp
      • docker compose create
      • docker compose down
      • docker compose events
      • docker compose exec
      • docker compose images
      • docker compose kill
      • docker compose logs
      • docker compose ls
      • docker compose pause
      • docker compose port
      • docker compose ps
      • docker compose pull
      • docker compose push
      • docker compose restart
      • docker compose rm
      • docker compose run
      • docker compose scale
      • docker compose start
      • docker compose stats
      • docker compose stop
      • docker compose top
      • docker compose unpause
      • docker compose up
      • docker compose version
      • docker compose wait
      • docker compose watch
    • Variáveis de Ambiente
    • Volume Bind Mount
    • Docker Volume
    • Docker Network - Bridge
    • Docker Network - Host Driver e Add Host
    • Ordenando a execução dos containers
    • Compose com build de imagem
    • Como Parametrizar o Compose com Variáveis de Ambiente
    • Múltiplos Composes
    • Extends
    • Merge
    • Include
    • Profiles
    • Comandos importantes do Docker Compose
  • Troubleshooting
    • Introdução
    • Docker Info
    • Docker Events
    • Docker Logs
    • Docker Inspect
    • Docker Top
    • Docker Stats
    • Docker Exec
  • Resiliência e Gerenciamento de Recursos
    • Introdução
    • Docker Restart
      • Introdução
      • on-failure
      • unless-stopped
      • always
      • Docker Compose
    • Healthcheck
      • Introdução
      • Linha de Comando
      • Docker Compose
      • Direto na Imagem
    • Gerenciamento de Recurso
      • CPU
        • Como Gerenciar CPU
        • Prática
      • Memória
        • Como Gerenciar Memória
        • Prática
      • Docker Compose
  • Fazendo um ambiente mais seguro
    • Introdução
    • Docker Scout
      • Introdução
      • Verificação Simples de Imagem
      • Como adicionar um repositório
      • Primeira melhoria na imagem
  • BUSCA RÁPIDA
    • Referências
    • Comandos
      • docker commit
      • docker compose
      • docker container
      • docker image
      • docker network
      • docker volume
    • Dockerfile
Powered by GitBook
On this page
  1. Avançando em imagens Docker com Dockerfile

ENV

A instrução ENV em um Dockerfile é usada para definir variáveis de ambiente que estarão disponíveis durante a construção da imagem e na execução do contêiner. Essas variáveis podem configurar comportamentos da aplicação, fornecer valores padrão, ou armazenar dados sensíveis (embora seja recomendado ter cuidado ao usá-las para este último propósito).

Sintaxe Básica

ENV VARIAVEL_NOME=valor

Funcionalidades do ENV

  • Definir Variáveis de Ambiente: Variáveis de ambiente definidas com ENV podem ser utilizadas em comandos subsequentes no Dockerfile, assim como na aplicação em execução dentro do contêiner.

  • Substituição de Variáveis: Você pode usar as variáveis definidas com ENV em outras instruções do Dockerfile, como RUN, CMD, e ENTRYPOINT.

Exemplos de Uso

Definir uma Variável de Ambiente Simples

FROM node:14
ENV NODE_ENV=production

Aqui, a variável NODE_ENV é definida como production. Essa variável pode ser usada pela aplicação Node.js para ajustar configurações de produção.

Usar Variáveis de Ambiente em Comandos RUN

FROM python:3.10
ENV APP_HOME=/usr/src/app
WORKDIR $APP_HOME
COPY . $APP_HOME

Neste exemplo:

  • A variável APP_HOME é definida como /usr/src/app.

  • O comando WORKDIR usa $APP_HOME para definir o diretório de trabalho.

  • O comando COPY também usa $APP_HOME para determinar o local onde os arquivos serão copiados.

Definir Múltiplas Variáveis em uma Única Instrução

FROM ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive \
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8

Aqui, três variáveis de ambiente são definidas em uma única instrução ENV, melhorando a legibilidade do Dockerfile.

Variáveis de Ambiente e Execução do Contêiner

As variáveis de ambiente definidas com ENV no Dockerfile estarão disponíveis para qualquer comando ou script que seja executado no contêiner.

Você pode sobrepor ou adicionar variáveis de ambiente ao executar um contêiner usando a opção -e ou --env no comando docker run:

docker run -e "NODE_ENV=development" nome_da_imagem

Este comando irá sobrescrever a variável NODE_ENV para o valor development apenas durante a execução do contêiner.

Boas Práticas e Considerações

  • Evitar Informações Sensíveis: Embora seja possível definir segredos ou credenciais com ENV, essa prática não é recomendada, pois as variáveis podem ser expostas ao inspecionar a imagem ou o contêiner. Use ferramentas específicas para gestão de segredos em vez disso.

  • Valor Padrão para Variáveis: Usar ENV para definir valores padrão é uma prática comum, permitindo que esses valores sejam sobrescritos durante a execução, se necessário.

  • Ordem das Instruções ENV: Colocar as instruções ENV no início do Dockerfile permite que você reutilize as variáveis nas instruções subsequentes, tornando o Dockerfile mais limpo e eficiente.

Exemplo Avançado

Configurando um Contêiner com Variáveis de Ambiente

FROM openjdk:11
ENV APP_HOME=/usr/local/app \
    APP_PORT=8080 \
    JAVA_OPTS="-Xmx256m"
    
WORKDIR $APP_HOME
COPY . $APP_HOME
EXPOSE $APP_PORT

CMD java $JAVA_OPTS -jar myapp.jar

Neste exemplo:

  • APP_HOME define o diretório base da aplicação.

  • APP_PORT configura a porta na qual a aplicação será exposta.

  • JAVA_OPTS permite ajustar as opções de execução do JVM.

  • Todas as variáveis são usadas posteriormente no Dockerfile, garantindo que os comandos sejam consistentes e configuráveis.

Resumo

  • ENV define variáveis de ambiente que podem ser usadas durante a construção da imagem e na execução do contêiner.

  • Variáveis de ambiente podem ser referenciadas em outras instruções do Dockerfile, melhorando a flexibilidade e configurabilidade.

  • É recomendável evitar o uso de ENV para armazenar informações sensíveis e adotar boas práticas de segurança e gestão de segredos.

Laboratório

Diferente de LABEL que não afeta a imagem nem o container, ENV cria uma variável de ambiente dentro do container.

FROM ubuntu
RUN apt update && apt install curl --yes
WORKDIR /app
ENV VALOR_DOCKER_ENV="Valor XPTO"
$ docker build -t ubuntu-curl .
[+] Building 0.1s (7/7) FINISHED                                    docker:default
 => [internal] load build definition from Dockerfile                          0.0s
 => => transferring dockerfile: 136B                                          0.0s
 => [internal] load metadata for docker.io/library/ubuntu:latest              0.0s
 => [internal] load .dockerignore                                             0.0s
 => => transferring context: 2B                                               0.0s
 => [1/3] FROM docker.io/library/ubuntu:latest                                0.0s
 => CACHED [2/3] RUN apt update && apt install curl --yes                     0.0s
 => CACHED [3/3] WORKDIR /app                                                 0.0s
 => exporting to image                                                        0.0s
 => => exporting layers                                                       0.0s
 => => writing image sha256:ef2943b98673eb1089a926715a28b6a03b99db1f5d4dc15f  0.0s
 => => naming to docker.io/library/ubuntu-curl                                0.0s
$ docker container run -it ubuntu-curl /bin/bash
root@37dd30b08bfb:/app# env
...
VALOR_DOCKER_ENV=Valor XPTO
...

A variável de ambiente pode ser sobrescrita na construção do container:

$ docker container run -it --env VALOR_DOCKER_ENV="Outro VALOR" ubuntu-curl /bin/bash
root@498f94960a05:/app# env
...
VALOR_DOCKER_ENV=Outro VALOR
...

PreviousLABELNextVOLUME

Last updated 9 months ago