Processar fotos da loja

DockerBeginner
Pratique Agora

Introdução

A Form & Field está preparando sua próxima coleção. Você tem uma fotografia de xícaras de cerâmica e uma arte de marca transparente. Produza imagens menores para a web, preservando os originais e o fundo transparente. Seu usuário comum deve continuar podendo editar os arquivos quando os contêineres de processamento desaparecerem.

O Docker e uma imagem preparada com ImageMagick estão prontos. Você precisa conhecer o básico de terminal e caminhos; Docker, bind mounts, opções de imagem e sintaxe do shell são apresentados antes do uso. Não instalará programas na estação nem escreverá código de processamento. A loja é fictícia; a foto é CC0 e a arte é material didático original.

Use Workstation para os comandos e Photo Desk para examinar e baixar as imagens reais. Este laboratório é independente do desafio do curso. Reserve cerca de 55 minutos, incluindo leitura e erros comuns; é uma estimativa do autor.

Processar uma pequena amostra

Você criará uma foto realmente reduzida com um contêiner de curta duração. Comece em Photo Desk, em Source collection. Abra a foto, volte com Back to collection e abra a arte da marca. O quadriculado atrás da arte indica pixels transparentes; não faz parte da imagem. Volte à coleção.

Fotografia e arte transparente fornecidas

Mude para Workstation, que inicia em /home/labex/project/photo-studio. pwd mostra o diretório atual e ls lista suas entradas. Se sair dele, volte com o comando cd abaixo; cd altera o diretório atual do shell.

cd /home/labex/project/photo-studio
ls

Os diretórios preparados source, samples e web guardam, respectivamente, originais, um resultado de prática e a entrega final. Preserve reference.jpg: é uma amostra independente, não sua saída.

Uma imagem reúne um programa e suas dependências. Um contêiner executa essa imagem como processo. Aqui, dk01-photo-tools:1 contém o programa convert do ImageMagick. :1 identifica a versão preparada da imagem, não um nome de contêiner. docker run cria e inicia um contêiner. --rm o remove quando o processo termina. Os argumentos após o nome da imagem são passados a convert.

Primeiro consulte a versão. -version é uma opção do ImageMagick, não do Docker:

docker run --rm dk01-photo-tools:1 -version

Espere ImageMagick 6.9.11-60 na saída. O programa roda dentro do contêiner; isso não instala convert na Workstation.

Conectar entrada e saída

O contêiner tem seus próprios caminhos. Um bind mount disponibiliza um diretório da estação em um caminho do contêiner. Para a amostra, conecte estes diretórios:

Diretório da estação Caminho do contêiner Acesso
source no diretório atual /input Somente leitura
samples no diretório atual /output Leitura e escrita

O diretório da estação é o src do mount; o caminho do contêiner é seu dst. type=bind seleciona esse tipo. readonly impede escritas na entrada por esse mount. Cada --mount descreve uma conexão. A saída gravada em /output chega a samples e sobrevive à remoção do contêiner.

Proprietários de arquivos também têm números. id -u mostra seu ID de usuário e id -g seu ID de grupo:

id -u
id -g

Use os valores reais, sem presumir 1000. No próximo comando, $(...) executa o comando entre parênteses e insere sua saída. Assim, --user "$(id -u):$(id -g)" executa a ferramenta com seu usuário e grupo numéricos. $PWD se expande para o caminho completo do diretório atual. Aspas duplas mantêm a descrição do mount como um argumento mesmo quando o caminho contém espaços.

No ImageMagick, -resize '320x320>' ajusta a foto dentro de 320 por 320 pixels, mantendo proporções. > significa apenas reduzir. Aspas simples o passam ao ImageMagick em vez de permitir que o shell o interprete como redirecionamento de saída. A barra invertida no fim da linha continua o mesmo comando na próxima; copie o bloco inteiro.

docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/samples,dst=/output" \
  dk01-photo-tools:1 /input/cups.jpg -resize '320x320>' /output/sample.jpg

Normalmente não há saída quando funciona. ls -l mostra o arquivo e seu proprietário:

ls -l samples/sample.jpg

O resultado útil é um arquivo comum de labex. --rm já removeu o contêiner, mas a saída montada permanece. Se o diretório de origem estiver escrito errado, o Docker informa um mount inválido em vez de criar uma foto válida. Leia pwd e ls source, corrija o caminho e repita o bloco. Não use sudo nem altere permissões para esconder um erro de caminho.

Entregar a foto e a arte transparente

Você criará o par final de imagens web. Em Photo Desk, selecione Your delivery. A página mostra formatos e limites, mas começa sem imagens. Resultados ausentes permanecem ausentes: ela nunca pega um original para preencher uma lacuna.

A foto das xícaras deve ser JPEG dentro de 640 por 640 pixels, com proporções preservadas. A arte deve ser PNG dentro de 256 por 256, mantendo transparência. Use o maior tamanho proporcional dentro de cada limite, sem ampliar entradas já menores. A caixa é um máximo, não um corte quadrado. A foto vertical fica com 480 por 640; a arte larga, com 256 por 128.

Mude para Workstation. Reutilize o mount de entrada, a identidade e a ferramenta. Altere apenas o mount de saída para web, o limite e o nome:

docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/cups.jpg -resize '640x640>' /output/cups.jpg

Processe agora a arte transparente. PNG aceita transparência; JPEG não. Manter a extensão PNG não basta se a imagem já foi achatada sobre um fundo. Este comando preserva os pixels transparentes originais:

docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/brand.png -resize '256x256>' /output/brand.png

Mude para Photo Desk, recarregue Your delivery e abra cada resultado. Leia as dimensões e examine as proporções da foto. O quadriculado deve continuar visível através da marca. Use Download file para cada resultado e volte com Back to collection. O download é o arquivo real do diretório web.

O par de imagens web concluído

A página é um leitor, não um processador ou avaliador. Uma imagem visível, sozinha, não prova que os originais estão intactos ou que a receita funciona em outra pasta. Se faltar uma imagem, volte à Workstation, verifique caminhos de entrada/saída e repita o comando correspondente. Uma página de arquivo ausente é diferente de uma falha de conexão com todo o leitor.

Salvar uma receita portátil

Salve os dois comandos Docker que funcionam para que outra cópia da pasta processe seus próprios originais. Comece em Workstation, em /home/labex/project/photo-studio.

Um script de shell é um arquivo de texto com comandos. bash run-photos.sh pede ao Bash para executá-los em ordem. O here-document abaixo grava em um arquivo as linhas entre os marcadores RECIPE: cat fornece o texto, > o salva e <<'RECIPE' marca um bloco literal. As aspas no primeiro marcador impedem a expansão de $PWD e $(id ...) ao salvar. Eles devem se expandir depois, quando alguém executar na própria pasta. O marcador final fica sozinho na linha.

set -e interrompe o script se um comando da ferramenta falhar, impedindo que outro posterior esconda a falha. Salve a receita completa:

cat > run-photos.sh <<'RECIPE'
#!/bin/bash
set -e
docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/cups.jpg -resize '640x640>' /output/cups.jpg
docker run --rm --user "$(id -u):$(id -g)" \
  --mount "type=bind,src=$PWD/source,dst=/input,readonly" \
  --mount "type=bind,src=$PWD/web,dst=/output" \
  dk01-photo-tools:1 /input/brand.png -resize '256x256>' /output/brand.png
RECIPE

cat sem redirecionamento mostra um arquivo. Verifique se a receita ainda contém literalmente $PWD e as substituições id:

cat run-photos.sh

Execute-a deste diretório. Ela atualiza intencionalmente os mesmos dois arquivos derivados; nunca deve reescrever os originais:

bash run-photos.sh

O contrato reutilizável é uma pasta com source, web e esta receita. Ela deve processar outra dupla compatível com os mesmos nomes quando copiada para outro local, incluindo uma pasta com espaços no nome. Originais menores mantêm as dimensões, sem ampliação. Use docker run comum no PATH, sem sudo, UID numérico fixo, caminho absoluto da estação, edição das fontes ou mounts extras do host. Os destinos no contêiner podem variar se a mesma relação segura funcionar. Não é necessária permissão de execução porque o arquivo é chamado pelo Bash.

Por fim, demonstre o uso comum dos arquivos. cp copia; mv renomeia ou move. Os dois comandos seguintes afetam apenas uma cópia da amostra derivada:

cp web/cups.jpg samples/shop-preview.jpg
mv samples/shop-preview.jpg samples/ready.jpg
ls -l samples/ready.jpg

Não precisam de acesso administrativo. Mantenha somente os dois arquivos pedidos em web; amostras ficam em samples. Nomes plausíveis não bastam: as verificações decodificam imagens reais e executam a receita inalterada em entradas compatíveis separadas. Não regeneram sua entrega.

Mude para Photo Desk, recarregue Your delivery, abra novamente ambas as saídas e volte à coleção. Os arquivos permanecem após todos os contêineres desaparecerem. Preserve os arquivos source e reference.jpg fornecidos.

Resumo

Você usou uma imagem Docker como ferramenta descartável, conectou diretórios de entrada e saída separados, protegeu os originais com um mount somente leitura e executou a ferramenta com seu UID/GID real. O JPEG e o PNG transparente permanecem editáveis após remover o contêiner. A receita salva processa entradas compatíveis em uma pasta movida sem instalar a ferramenta na estação.