Introdução
Um serviço de relatórios precisa ler configurações e gravar documentos, mas sua montagem de configuração também permite escrita. Como responsável pela manutenção, você reduzirá esse acesso desnecessário sem quebrar a geração de relatórios.
Primeiro gere um relatório normal, depois proteja a montagem de entrada e recrie somente o contêiner de relatórios. Basta familiaridade básica com o terminal; Docker, sintaxe de montagem e edição são explicados antes do uso.
Gerar um relatório normal
Nesta etapa, execute a tarefa empresarial normal antes de alterar permissões. A Harbor Books usa um pequeno serviço para somar pedidos e produzir um documento. Todos os clientes e números são dados sintéticos de treinamento.
Use o terminal Maintenance, uma função de manutenção do host Linux com acesso à administração do Docker. O Docker inicia processos da aplicação em contêineres: cada um vê seu próprio sistema de arquivos e lista de processos, mas compartilha o kernel do host. Um contêiner não é outra VM. Gerencie somente report-renderer e os arquivos em /home/labex/project/report-desk.
O terminal começa nesse diretório. pwd mostra o diretório atual:
pwd
O resultado deve ser /home/labex/project/report-desk. Se mudou de diretório, volte com cd /home/labex/project/report-desk.
A aplicação escuta na porta 8090. Uma porta identifica um serviço; aqui, localhost é o host de manutenção, cuja porta o Docker encaminha ao contêiner. curl envia uma requisição HTTP, -X POST seleciona uma requisição de ação e -fsS mostra erros mantendo a saída de sucesso concisa. Solicite o documento inicial:
curl -fsS -X POST http://localhost:8090/render/baseline
{"saved": "/output/baseline.json", "total": 37, "uid": 0}
O serviço leu a entrada e salvou um arquivo real. cat mostra um arquivo; o host vê /output do contêiner como seu diretório local output:
cat output/baseline.json
Encontre Report for Harbor Books: 37 orders. Os outros campos registram a identidade da entrada e a instância do serviço. Abra Document Desk e atualize: baseline.json aparece em Stored documents. Essa página lista arquivos reais, mas não certifica permissões seguras.
Proteger a declaração de entrada
Nesta etapa, relacione os caminhos de entrada e saída, demonstre uma escrita desnecessária e edite a declaração de inicialização. Um bind mount conecta um diretório do host a um caminho no contêiner. Ele permite escrita salvo restrição explícita.
cat launch.sh mostra o script Bash preparado:
cat launch.sh
Uma barra invertida continua o comando na linha seguinte. sudo administra o Docker com permissão de administrador do host; não determina o usuário da aplicação. docker run -d inicia um contêiner em segundo plano, --name o identifica, --user 0:0 seleciona IDs de usuário/grupo e -p 8090:8090 encaminha a porta do host à porta do contêiner. O último argumento é a imagem preparada c12-renderer:1.
Cada --mount tem campos separados por vírgulas: type=bind conecta um caminho do host, src é esse caminho e dst é o caminho do contêiner.
| Diretório do host | Diretório do contêiner | Acesso necessário |
|---|---|---|
report-desk/config |
/config |
Ler lote e modelo |
report-desk/output |
/output |
Gravar documentos gerados |
A configuração inclui probe.txt, uma amostra descartável sem dados empresariais. docker exec executa um comando dentro do contêiner indicado em execução. touch atualiza a data da amostra; é um acesso desnecessário da aplicação, demonstrado de propósito:
sudo docker exec report-renderer touch /config/probe.txt
Nenhuma saída significa sucesso. Isso demonstra uma montagem de configuração gravável sem danificar o lote nem o modelo. Proteger a declaração do host muda o próximo contêiner criado pelo Docker; editar um arquivo no contêiner atual não muda seu modo de montagem.
Use o editor de terminal nano para alterar a declaração:
nano launch.sh
Mova-se com as setas. Na linha com dst=/config, acrescente ,readonly logo após /config, antes do espaço e da barra invertida. Mantenha /output gravável. Salve com Ctrl+O, Enter e saia com Ctrl+X. A linha deve ficar assim:
--mount type=bind,src=/home/labex/project/report-desk/config,dst=/config,readonly \
Mostre cat launch.sh novamente para localizar vírgulas ou barras invertidas ausentes. Reabra nano launch.sh para corrigir erros. O contêiner em execução ainda usa a montagem antiga; a próxima etapa o substitui.
Aplicar e testar o limite da montagem
Nesta etapa, substitua somente o contêiner de relatórios e prove que negar escritas na entrada é compatível com uma saída funcional. Alterar o script não atualiza um contêiner existente.
docker rm -f para e remove o contêiner indicado. Os diretórios do host conectados por bind mount permanecem. bash launch.sh executa a declaração editada:
sudo docker rm -f report-renderer
bash launch.sh
O segundo comando imprime um novo ID. Aguarde um momento pela inicialização. Se houver erro de sintaxe ou montagem, corrija a linha com nano launch.sh, remova qualquer report-renderer recém-criado com o mesmo comando e execute o script novamente. Não exclua os diretórios de dados do host.
docker inspect lê as configurações reais. --format seleciona um campo; preserve as aspas simples para que o shell passe as chaves sem mudanças:
sudo docker inspect report-renderer --format '{{json .Mounts}}'
Encontre "Destination":"/config" com "RW":false, e /output com "RW":true. RW significa leitura/escrita. Confirme o limite real com a mesma amostra:
sudo docker exec report-renderer touch /config/probe.txt
touch: /config/probe.txt: Read-only file system
Essa saída diferente de zero é esperada. O terminal continua disponível; siga para o próximo comando. Erro de conexão ou contêiner ausente é diferente: corrija ou reinicie o script.
Solicite um documento novo ao serviço recriado:
curl -fsS -X POST http://localhost:8090/render/final
{"saved": "/output/final.json", "total": 37, "uid": 0}
cat output/final.json
O documento ainda contém Report for Harbor Books: 37 orders. Atualize Document Desk para ver final.json. O serviço lê entradas e grava saídas, enquanto a montagem de configuração recusa escrita. Ele ainda executa como root; o próximo laboratório independente trata dessa outra permissão.
Resumo
Você gerou um relatório real, relacionou caminhos do host e do contêiner, tornou a montagem de entrada somente leitura e recriou o serviço. A inspeção real da montagem e uma escrita recusada confirmaram a proteção; um novo relatório confirmou que a saída continua funcionando.



