Apagado na última camada: como recuperar um segredo de uma imagem Docker
O desafio
O build da Pinewood apaga o .env no fim. Uma imagem não esquece nada: vasculhe ~/image. Recupere a STRIPE_KEY desse .env.
O que você vai aprender
- Explicar como uma imagem Docker é construída a partir de camadas empilhadas, na ordem do manifest
- Reconhecer um arquivo whiteout e o que ele esconde
- Localizar um arquivo apagado em uma camada anterior e lê-lo
- Manter segredos de build fora das camadas da imagem
Habilidades testadas
Pré-requisitos
- Comandos básicos de shell (ls, cat, find)
- O que é um Dockerfile
Como funciona
Cada COPY, ADD e RUN em um Dockerfile produz uma nova camada somente leitura. A imagem é a pilha de todas elas, e um contêiner enxerga a visão combinada.
Quando uma etapa posterior apaga um arquivo, o Docker não consegue reescrever a camada anterior. Em vez disso, ele adiciona uma entrada whiteout, um arquivo chamado .wh.<name>, que instrui a visão combinada a esconder o original. Os bytes originais continuam sendo entregues dentro da camada anterior.
O docker save exporta cada camada como um tarball, então qualquer pessoa que consiga baixar uma imagem pública pode ler todos os arquivos que qualquer etapa do build já escreveu.
Erros comuns
- Usar um
lssimples. O.envé um dotfile, então só aparece comls -aoufind. - Ler o whiteout. O
.wh..envestá vazio: ele é o marcador de exclusão, não o arquivo. - Pegar o primeiro .env que aparecer. Duas camadas escreveram um. Os ids das camadas não seguem a ordem do build: o
manifest.jsonsegue, e a escrita mais recente é a que a produção usou. - Pegar o arquivo de exemplo. O
.env.examplecontém um valorsk_test_de placeholder.
Como se proteger
- Exclua o
.enve outros arquivos de segredo do contexto de build no.dockerignore. - Passe segredos de build com BuildKit:
RUN --mount=type=secret,id=env ...monta o segredo para uma única etapa e nunca o grava em uma camada. - Use builds multi-stage para que apenas os artefatos finais cheguem à imagem entregue.
- Injete segredos de execução como variáveis de ambiente ou a partir de um gerenciador de segredos, e revogue toda chave que já esteve em uma imagem publicada.