Классифицируйте данные
Куда поместить 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.txtContainer уже удалён, но 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-atVolume существует независимо от containers. Удалите его явно после лаборатории:
docker volume rm wms-db-datadown -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».
Проверка понимания
Первичные источники
- Docker storage — writable layer и типы mounts.
- Docker volumes — lifecycle и управление.
- Docker bind mounts — связь с host filesystem.
Если CI runner использует rootless Docker или Kubernetes executor, уточните ownership-модель с преподавателем отдельно.