매장 사진 처리하기

DockerBeginner
지금 연습하기

소개

Form & Field가 다음 매장 컬렉션을 준비합니다. 도자기 컵 사진과 투명한 브랜드 그래픽이 있습니다. 원본과 투명 배경을 유지하면서 작은 웹 이미지를 만드세요. 처리 컨테이너가 사라진 뒤에도 일반 사용자로 완성 파일을 편집할 수 있어야 합니다.

Docker와 준비된 ImageMagick 도구 이미지가 제공됩니다. 기본 터미널과 경로 사용법을 알아야 하며, Docker, 바인드 마운트, 이미지 옵션, 셸 문법은 사용 전에 설명합니다. 워크스테이션에 소프트웨어를 설치하거나 이미지 처리 코드를 작성하지 않습니다. 매장은 가상이며 사진은 CC0, 브랜드 그래픽은 직접 만든 교육 자료입니다.

명령은 Workstation에서 실행하고 실제 이미지는 Photo Desk에서 확인하고 다운로드합니다. 이 실습은 과정의 챌린지와 독립적입니다. 읽기와 일반적인 실수를 포함하여 약 55분을 예상하세요. 이는 저자의 추정입니다.

작은 샘플 처리하기

짧게 실행되는 컨테이너로 실제로 축소된 사진을 만듭니다. Photo Desk의 Source collection에서 시작하세요. 사진을 열고 Back to collection으로 돌아온 뒤 브랜드 그래픽을 엽니다. 뒤의 체크무늬는 투명 픽셀을 나타내며 이미지의 일부가 아닙니다. 컬렉션으로 돌아오세요.

제공된 사진과 투명 그래픽

Workstation으로 전환합니다. 시작 위치는 /home/labex/project/photo-studio입니다. pwd는 현재 디렉터리를, ls는 내용을 표시합니다. 이곳을 벗어났다면 다음 cd 명령으로 돌아오세요. cd는 셸의 현재 디렉터리를 바꿉니다.

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

준비된 source, samples, web은 각각 원본, 연습 결과, 최종 전달 파일을 담습니다. reference.jpg는 변경하지 마세요. 별도의 예시이며 여러분의 출력이 아닙니다.

이미지는 프로그램과 의존성을 묶습니다. 컨테이너는 이미지를 프로세스로 실행합니다. 여기서 dk01-photo-tools:1에는 ImageMagick의 convert가 들어 있습니다. :1은 준비된 이미지 버전이며 컨테이너 이름이 아닙니다. docker run은 컨테이너를 만들고 시작합니다. --rm은 프로세스 종료 후 컨테이너를 제거합니다. 이미지 이름 뒤의 인자는 convert에 전달됩니다.

먼저 버전을 확인하세요. -version은 Docker가 아닌 ImageMagick 옵션입니다.

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

출력에 ImageMagick 6.9.11-60이 있어야 합니다. 프로그램은 컨테이너 안에서 실행되므로 Workstation에 convert가 설치되지는 않습니다.

입력과 출력 연결하기

컨테이너는 자체 파일 시스템 경로를 가집니다. 바인드 마운트는 워크스테이션 디렉터리를 컨테이너 경로에서 사용할 수 있게 합니다. 샘플에는 다음을 연결합니다.

워크스테이션 디렉터리 컨테이너 경로 접근
현재 디렉터리의 source /input 읽기 전용
현재 디렉터리의 samples /output 읽기와 쓰기

워크스테이션 디렉터리는 마운트의 src, 컨테이너 경로는 dst입니다. type=bind는 이 마운트 유형을 선택합니다. readonly는 이 연결을 통한 입력 쓰기를 막습니다. 각 --mount는 연결 하나를 설명합니다. /output에 쓴 결과는 samples에 도착하며 컨테이너 삭제 뒤에도 남습니다.

파일 소유자도 숫자 ID를 가집니다. id -u는 사용자 ID, id -g는 그룹 ID를 표시합니다.

id -u
id -g

1000이라고 가정하지 말고 실제 값을 사용하세요. 다음 명령의 $(...)는 괄호 안 명령을 실행해 출력을 삽입합니다. 따라서 --user "$(id -u):$(id -g)"는 현재 숫자 사용자와 그룹으로 도구를 실행합니다. $PWD는 현재 디렉터리의 전체 경로로 확장됩니다. 큰따옴표는 경로에 공백이 있어도 마운트 설명을 하나의 인자로 유지합니다.

ImageMagick에서 -resize '320x320>'는 비율을 유지해 사진을 320 × 320픽셀 안에 맞춥니다. >는 축소만 한다는 뜻입니다. 작은따옴표는 셸이 출력 리다이렉션으로 해석하지 않고 ImageMagick에 전달하도록 합니다. 줄 끝의 역슬래시는 같은 명령을 다음 줄로 이어 줍니다. 전체 블록을 복사하세요.

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

성공하면 보통 출력이 없습니다. ls -l로 생성 파일과 소유자를 확인합니다.

ls -l samples/sample.jpg

labex 소유의 일반 파일이 유용한 결과입니다. --rm으로 컨테이너는 이미 제거되었지만 마운트된 출력은 남습니다. 소스 디렉터리를 잘못 쓰면 Docker는 올바른 사진을 만드는 대신 잘못된 마운트를 보고합니다. pwd와 ls source를 확인하고 경로를 고친 뒤 같은 블록을 다시 실행하세요. 경로 오류를 숨기려고 sudo를 쓰거나 디렉터리 권한을 바꾸지 마세요.

사진과 투명 그래픽 전달하기

최종 웹 이미지 두 장을 만듭니다. Photo Desk에서 Your delivery를 선택하세요. 형식과 제한이 표시되지만 처음에는 이미지가 없습니다. 없는 결과는 없는 상태로 남으며 원본으로 채우지 않습니다.

컵 사진은 비율을 유지한 640 × 640픽셀 이내의 JPEG여야 합니다. 브랜드 그래픽은 투명도를 유지한 256 × 256 이내의 PNG여야 합니다. 각 범위에서 가장 큰 비례 크기를 사용하되 이미 작은 입력은 확대하지 마세요. 경계 상자는 최대값이며 정사각형 자르기가 아닙니다. 세로 사진은 480 × 640, 가로 그래픽은 256 × 128이 됩니다.

Workstation으로 전환합니다. 같은 입력 마운트, 사용자, 도구를 사용하고 출력 마운트를 web으로 바꾸면서 크기 제한과 출력 이름만 변경합니다.

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

이제 투명 그래픽을 처리합니다. PNG는 투명도를 지원하지만 JPEG는 지원하지 않습니다. 이미 배경에 합쳐진 이미지라면 PNG 확장자만 유지해서는 부족합니다. 이 명령은 원래 투명 픽셀을 유지합니다.

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

Photo Desk로 전환해 Your delivery를 새로 고치고 각 결과를 엽니다. 표시 크기와 사진 비율을 확인하세요. 브랜드 뒤로 체크무늬가 여전히 보여야 합니다. 각 결과에서 Download file을 누르고 Back to collection으로 돌아옵니다. 다운로드는 web 디렉터리의 실제 파일입니다.

완성된 웹 이미지 두 장

이 화면은 파일 읽기 도구이지 처리기나 채점기가 아닙니다. 이미지가 보인다는 사실만으로 원본 보존이나 다른 폴더에서의 스크립트 실행이 입증되지는 않습니다. 이미지가 없으면 Workstation으로 돌아가 입출력 경로를 확인하고 해당 명령을 다시 실행하세요. 파일 없음 페이지와 전체 화면 연결 실패는 다른 상태입니다.

이동 가능한 처리 스크립트 저장하기

성공한 두 Docker 명령을 저장해 다른 스튜디오 폴더 복사본도 자기 원본을 처리하도록 합니다. Workstation의 /home/labex/project/photo-studio에서 시작하세요.

셸 스크립트는 명령을 담은 텍스트 파일입니다. bash run-photos.sh는 Bash가 순서대로 실행하게 합니다. 다음 here-document는 RECIPE 표시 사이의 줄을 파일에 씁니다. cat은 텍스트를 제공하고 >는 저장하며 <<'RECIPE'는 리터럴 텍스트 블록을 표시합니다. 첫 표시를 따옴표로 감싸면 저장할 때 $PWD와 $(id ...)가 확장되지 않습니다. 이들은 나중에 각자의 폴더에서 실행할 때 확장되어야 합니다. 종료 표시는 한 줄에 단독으로 둡니다.

set -e는 도구 명령 실패 시 스크립트를 멈춰 뒤의 명령이 앞의 실패를 가리지 않게 합니다. 전체 스크립트를 저장하세요.

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은 파일을 표시합니다. 저장한 스크립트에 $PWD와 id 치환이 문자 그대로 남아 있는지 읽어 보세요.

cat run-photos.sh

이 스튜디오 디렉터리에서 실행합니다. 같은 파생 파일 두 개를 의도적으로 갱신하지만 원본을 다시 쓰면 안 됩니다.

bash run-photos.sh

재사용 계약은 source, web, 이 스크립트가 있는 폴더입니다. 이름에 공백이 있는 곳을 포함해 다른 위치로 복사해도 같은 파일명의 다른 호환 이미지를 처리해야 합니다. 작은 원본은 확대하지 않고 크기를 유지합니다. PATH의 일반 docker run을 사용하며 sudo, 고정 숫자 UID, 워크스테이션 절대 경로, 소스 편집, 추가 호스트 마운트는 사용하지 않습니다. 동일한 안전한 입출력 관계가 유지되면 컨테이너 대상 경로는 달라도 됩니다. Bash를 통해 호출하므로 실행 권한은 필요 없습니다.

마지막으로 일반 파일 사용을 확인합니다. cp는 복사하고 mv는 이름 변경 또는 이동합니다. 다음 두 명령은 파생 샘플의 복사본만 다룹니다.

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

관리자 권한은 필요 없습니다. web에는 요구된 두 파일만 두고 샘플은 samples에 둡니다. 그럴듯한 파일 이름만으로는 부족합니다. 검사는 실제 이미지를 디코딩하고 별도의 호환 입력에서 변경 없는 스크립트를 실행합니다. 여러분의 결과를 다시 생성하지 않습니다.

Photo Desk로 전환해 Your delivery를 새로 고치고 두 출력을 다시 열고 컬렉션으로 돌아옵니다. 처리 컨테이너가 모두 사라져도 파일은 남습니다. 제공된 source 파일과 reference.jpg를 보존하세요.

요약

Docker 이미지를 일회용 사진 도구로 사용하고 입력과 출력 디렉터리를 분리해 연결했으며, 읽기 전용 마운트로 원본을 보호하고 실제 UID/GID로 도구를 실행했습니다. 실제 JPEG와 투명 PNG는 컨테이너 제거 후에도 편집할 수 있습니다. 저장한 처리 스크립트는 도구를 워크스테이션에 설치하지 않고 이동한 폴더에서 호환 입력을 처리합니다.