Introdução
A Pine & Path está enviando seu guia de visitantes de Alder Ridge para outro centro de visitantes. A imagem atual funciona, mas leva o compilador Go, os arquivos-fonte e os resíduos da compilação junto com a aplicação. Entregue uma imagem de execução enxuta que continue oferecendo as quatro trilhas, os filtros de dificuldade, as páginas de detalhes, as ilustrações locais e os downloads completos das rotas GPX.
Você já deve saber criar e executar uma imagem Docker simples e reconhecer FROM, COPY no Dockerfile e a publicação de portas. Não é necessário programar em Go: a aplicação completa e seus materiais são fornecidos. Este laboratório explica a compilação, os estágios de construção, a organização dos arquivos de execução e a sintaxe de escrita de arquivos no shell antes de utilizá-los. O parque e os dados das rotas são materiais didáticos fictícios.
O Docker, a imagem de compilação e o serviço de referência fornecido estão prontos. Use Workstation para os comandos, Reference Guide para o exemplo funcional e Your Guide para sua entrega. Este laboratório é independente do desafio. Reserve cerca de 60 minutos para leitura, compilações e erros comuns; essa é uma estimativa do autor.
Crie a imagem inicial funcional
Nesta etapa, você conhecerá o funcionamento de um guia completo e depois criará a imagem inicial fornecida. Comece em Reference Guide. Ele mostra quatro trilhas. Selecione Easy, abra Cedar Loop, leia a distância e o ganho de elevação e use Download GPX. GPX é um formato XML que contém uma trilha nomeada e pontos geográficos; esse download é um arquivo de rota real. Selecione Back to trails, depois Moderate, e abra Ridge Path. Volte à lista de todas as trilhas. Observe a folha de estilos e o mapa esquemático, além do texto: eles também são recursos de execução.

Mude para Workstation, que inicia em /home/labex/project/trail-guide. pwd mostra o diretório atual e ls lista suas entradas. Se você sair do projeto, o seguinte cd volta para ele:
cd /home/labex/project/trail-guide
ls
A estrutura fornecida é:
| Caminho de origem | Finalidade na execução |
|---|---|
app/main.go |
Programa Go a compilar; seu código-fonte não é necessário na execução |
content/trails.json |
As quatro trilhas e suas relações |
content/routes/ |
Os quatro downloads GPX |
public/ |
Folha de estilos e ilustrações esquemáticas originais |
author-notes/, build-cache/ |
Rascunhos e resíduos, não recursos de execução |
Mantenha esses materiais fornecidos e o serviço de referência inalterados. Você editará Dockerfile, adicionará .dockerignore e criará imagens e contêineres do curso. Dockerfile.incomplete é um exemplo de falha fornecido para a próxima etapa.
cat mostra um arquivo de texto. Leia o Dockerfile existente:
cat Dockerfile
Ele parte de dk02-go-builder:1, uma imagem preparada com o compilador Go. WORKDIR /guide seleciona o diretório de trabalho dentro da imagem. COPY . . copia o contexto de construção atual para esse diretório, incluindo arquivos dos quais a aplicação final não precisa. O último ENTRYPOINT é um array JSON que inicia diretamente o programa compilado.
O comando de compilação define CGO_ENABLED=0 somente para aquele comando, de modo que este exemplo Go, que usa a biblioteca padrão, não precise de bibliotecas C. go build compila o programa fornecido; -trimpath remove do executável os detalhes dos diretórios locais do código-fonte, e -o /guide/guide define seu nome. Isso torna este programa específico adequado a uma base de execução vazia. Outros programas podem precisar de bibliotecas compartilhadas, certificados ou outros dados; uma base vazia não é uma solução universal.
Primeiro, leia a versão do compilador. docker run --rm cria um contêiner temporário e o remove ao terminar o comando. As palavras após o nome da imagem selecionam o comando a executar:
docker run --rm dk02-go-builder:1 go version
A saída identifica Go 1.26 no Linux. Isso executa o compilador em um contêiner, e não em Workstation.
Crie a imagem inicial. docker build lê o Dockerfile; -t atribui uma tag ao resultado, e o . final seleciona o diretório atual como contexto de construção:
docker build -t trail-guide:sample .
Aguarde o resultado de construção bem-sucedida. A tag identifica uma imagem, não um contêiner em execução. Para ver seu tamanho em bytes, docker image inspect lê os metadados e --format seleciona um campo. As aspas simples passam o modelo literalmente:
docker image inspect trail-guide:sample --format '{{.Size}}'
O número varia conforme a imagem preparada do compilador. A imagem inicial funciona, mas ainda inclui o compilador e o código-fonte. Um tamanho pequeno, por si só, não comprovará que a substituta está completa.
Separe os arquivos de compilação dos arquivos de execução
Nesta etapa, você compilará o programa em um estágio e entregará apenas o executável e os recursos de execução em outro. Comece em Workstation, no mesmo diretório do projeto. Um estágio começa com uma instrução FROM. Nomeá-lo com AS build permite que um COPY --from=build posterior obtenha um resultado sem herdar o compilador ou as camadas anteriores do sistema de arquivos.
Primeiro, examine uma entrega realmente incompleta. O Dockerfile.incomplete fornecido compila o programa e copia as ilustrações públicas, mas deixa de fora os dados das trilhas:
cat Dockerfile.incomplete
A opção -f seleciona esse Dockerfile alternativo:
docker build -f Dockerfile.incomplete -t trail-guide:incomplete .
A construção tem sucesso porque a compilação não lê a coleção de trilhas. Espera-se deliberadamente que a execução seguinte falhe com o status de saída 1:
docker run --rm trail-guide:incomplete
Leia o erro: open content/trails.json: no such file or directory. O executável existe, mas faltam seus dados de execução. Uma construção bem-sucedida e uma aplicação completa são resultados diferentes. O contêiner temporário que falhou foi removido. Corrija o Dockerfile normal, em vez de reparar aquele contêiner ou alterar a aplicação.
Um here-document salva um bloco de texto completo. Abaixo, cat fornece as linhas, > grava Dockerfile, e <<'DOCKERFILE' marca um bloco literal que termina em uma linha contendo apenas DOCKERFILE. As aspas no marcador inicial impedem expansões do shell durante a gravação. Substitua apenas o Dockerfile editável:
cat > Dockerfile <<'DOCKERFILE'
FROM dk02-go-builder:1 AS build
WORKDIR /src
COPY app/main.go ./main.go
RUN CGO_ENABLED=0 go build -trimpath -o /out/guide main.go
FROM scratch
WORKDIR /guide
COPY --from=build /out/guide ./guide
COPY content/ ./content/
COPY public/ ./public/
ENTRYPOINT ["/guide/guide"]
DOCKERFILE
Acompanhe os arquivos: o primeiro estágio compila o código-fonte em /out/guide. O segundo FROM parte de scratch, a base com sistema de arquivos vazio do Docker, sem herdar o primeiro estágio. O executável passa a ser /guide/guide; os dados das trilhas e os arquivos GPX mantêm sua estrutura em content; estilos e ilustrações mantêm sua estrutura em public. O programa lê esses caminhos relativos a partir de seu diretório de trabalho. Por isso, copiar apenas o executável era insuficiente.
A imagem final não tem shell nem compilador. Isso é esperado aqui. Examine a aplicação, em vez de tentar executar um shell dentro dela.
O contexto de construção é outra questão. .dockerignore exclui os caminhos correspondentes do contexto antes de enviá-los ao construtor. O ponto inicial torna esse nome de arquivo oculto. Estas regras omitem rascunhos e cache antigo, sem omitir a aplicação ou seus recursos de execução:
cat > .dockerignore <<'IGNORE'
author-notes/
build-cache/
IGNORE
O Dockerfile com dois estágios seleciona explicitamente os arquivos de execução; o arquivo de exclusão também evita o envio de material desnecessário. Excluir um arquivo do contexto não remove bytes já armazenados em camadas herdadas. É o estágio separado de execução que deixa para trás as camadas de compilação.
Crie a imagem para entrega:
docker build -t trail-guide:lean .
docker image inspect trail-guide:lean --format '{{.Size}}'
Compare com o número da imagem de exemplo. O resultado útil é uma imagem de execução menor com um guia completo, não o menor número possível. Se um COPY falhar, leia o caminho de origem ausente e compare-o com a tabela da estrutura e o diretório atual. Corrija o Dockerfile ou a regra de exclusão e reconstrua. Não crie dados substitutos nem monte a pasta de origem para disfarçar uma imagem incompleta.
Execute e recrie o guia entregue
Nesta etapa, você executará a imagem sem depender da pasta de origem e usará o guia completo. Comece em Workstation. O programa escuta na porta 8080 do contêiner. A publicação 8090:8080 o disponibiliza na porta 8090 de Workstation, exibida por Your Guide. -d deixa o servidor em segundo plano; --name nomeia esse contêiner do curso. Não adicione montagens: a imagem deve conter seus próprios recursos.
docker run -d --name trail-guide -p 8090:8080 trail-guide:lean
A saída é um ID de contêiner. Esse contêiner permanece em execução para servir o guia. docker logs lê a saída do programa; --tail 5 limita a leitura às cinco últimas linhas:
docker logs --tail 5 trail-guide
Espere Guide listening on :8080, a porta do contêiner, e não a porta publicada do host. Se o nome do contêiner já estiver em uso por uma tentativa anterior, use o comando de remoção limitado ao curso abaixo e execute novamente o comando de início. Um erro de recurso ausente exige corrigir o Dockerfile e reconstruir primeiro.
Mude para Your Guide e recarregue. As quatro trilhas devem aparecer. Selecione Easy: apenas Cedar Loop e River Walk aparecem. Abra Cedar Loop, examine seus dados e mapa e baixe seu GPX. Use Back to trails, escolha Moderate, abra Ridge Path e baixe também essa rota. Volte a todas as trilhas. As ilustrações e os estilos locais devem carregar, e os trajetos devem pertencer às trilhas selecionadas. Reference Guide continua disponível de forma independente.

Agora demonstre um contêiner substituto usando a mesma imagem. Mude para Workstation. docker rm -f para e remove apenas o contêiner nomeado do curso; não remove a imagem. Mantenha dk02-reference em execução:
docker rm -f trail-guide
Crie uma nova instância sem montagens:
docker run -d --name trail-guide -p 8090:8080 trail-guide:lean
Mude para Your Guide, recarregue e repita as visitas e os downloads de Easy/Cedar Loop e Moderate/Ridge Path. Esse novo contêiner nunca recebeu a pasta de origem de Workstation. Seus recursos de execução vieram da imagem.
Mantenha o contêiner em execução. Após futuras alterações no Dockerfile, reconstruir uma tag não atualiza um contêiner existente; remova e recrie somente o contêiner do curso para executar a nova imagem. Um serviço parado ou uma falha de conexão é diferente da página Trail not found do próprio guia para uma rota desconhecida.
Resumo
Você separou um estágio com compilador de um estágio de execução vazio, copiou os recursos reais necessários à aplicação e manteve os rascunhos fora do contexto de construção. Sua imagem enxuta serve a coleção completa, os filtros, os detalhes, as ilustrações e os downloads GPX sem montagens de Workstation. Recriar seu contêiner demonstrou que a imagem é uma entrega reutilizável, em vez de um processo que toma emprestada a pasta de origem.



