Урок 06 · Storage

Данные и результаты тестов

Выберите storage по владельцу и сроку жизни данных: report должен попасть в CI workspace, DB state — пережить container, secrets/cache — исчезнуть.

Время: 20 минутРезультат: сохранённый reportИнтервью: mounts и permissions

Классифицируйте данные

Куда поместить Playwright trace, данные PostgreSQL и временный browser cache? Ответьте до таблицы.

Writable layer не является хранилищем

Запись без mount попадает в уникальный writable layer container. Она существует после stop/start того же container, но исчезает вместе с ним и плохо подходит для обмена с host или другим container.

МеханизмВладелец и сценарий
Bind mountКонкретный host path. Исходники, CI workspace, reports и traces, которые должен прочитать host.
Named volumeУправляется Docker. Состояние PostgreSQL/Redis и данные, переживающие замену container.
tmpfsПамять host. Временные или чувствительные данные, которые не должны сохраняться на disk.
Writable layerЭфемерные внутренние файлы одного container; не полагаться на них после удаления.

Практика: вынести test result

mkdir -p test-results

docker run --rm \
  --mount type=bind,source="$PWD/test-results",target=/results \
  alpine:3.21 \
  sh -c 'printf "status=passed\n" > /results/result.txt'

cat test-results/result.txt

Container уже удалён, но result принадлежит workspace. На Linux проверьте UID/GID файла: process внутри container может создать root-owned artifact, который CI cleanup не сможет удалить. Решение — согласовать runtime UID или изменить владельца в контролируемой точке.

docker run --rm --user "$(id -u):$(id -g)" \
  --mount type=bind,source="$PWD/test-results",target=/results \
  alpine:3.21 \
  sh -c 'printf "owner=runner\n" > /results/owned.txt'

Практика: состояние сервиса

docker volume create wms-db-data

docker run --detach --name state-writer \
  --mount type=volume,source=wms-db-data,target=/data \
  alpine:3.21 sh -c 'date > /data/created-at; sleep 3600'

docker rm --force state-writer

docker run --rm \
  --mount type=volume,source=wms-db-data,target=/data,readonly \
  alpine:3.21 cat /data/created-at

Volume существует независимо от containers. Удалите его явно после лаборатории:

docker volume rm wms-db-data
Осторожно с down -vФлаг удаляет volumes Compose-проекта. Для чистого тестового стенда это полезный reset, для единственной копии ценных данных — потеря состояния.

Политика для AQA-контура

  • Test reports, screenshots и traces: bind mount в CI workspace + artifacts policy.
  • DB state одной среды: named volume; seed/migrations делают состояние воспроизводимым.
  • Одноразовые secrets и caches: tmpfs или secret mechanism, если поддерживается средой.
  • Исходники в development: bind mount; в CI image лучше собрать заранее.
  • Всё, что важно после удаления container, не должно оставаться только в writable layer.

«Выбор mount определяется владельцем и lifecycle данных. Reports монтирую в CI workspace, чтобы runner собрал artifacts. Состояние DB выношу в named volume, но обеспечиваю воспроизводимый seed. Временные чувствительные данные могу положить в tmpfs. Отдельно проверяю UID/GID, потому что root-owned artifacts часто ломают cleanup».

Проверка понимания

1. Куда писать Playwright artifacts?

2. DB должна пережить замену container.

3. Для чего подходит tmpfs?

Первичные источники

Если CI runner использует rootless Docker или Kubernetes executor, уточните ownership-модель с преподавателем отдельно.