tmpfs - файлова система в оперативній пам'яті. Дані ніколи не потрапляють на диск хоста і зникають при зупинці контейнера.
docker run --tmpfs /tmp:rw,size=64m,mode=1777 myapp
services:
app:
tmpfs:
- /tmp:size=64m
read_only: true
Три види сховища в Docker:
| Том | Bind mount | tmpfs | |
|---|---|---|---|
| де дані | область Docker на диску | каталог хоста | пам'ять |
| переживає контейнер | так | так | ні |
| швидкість | диск | диск (на macOS - повільно) | пам'ять |
| для чого | дані, що мають зберігатися | код у розробці, конфіги | тимчасові й чутливі дані |
Коли tmpfs доречний:
- файлова система лише для читання:
read_only: true- сильний захист (зловмисник не запише бекдор у код), але застосунку потрібні тимчасові файли. tmpfs для/tmp,/runі каталогів кешу дає записуване місце без ослаблення захисту; - чутливі тимчасові дані, які не повинні потрапити на диск: розшифровані файли, тимчасові ключі;
- швидкий тимчасовий кеш: скомпільовані шаблони, тимчасові файли обробки - коли їх втрата при перезапуску не страшна;
- тести: база в tmpfs (
/var/lib/postgresql/dataу тестовому контейнері) значно прискорює тести з багатьма записами.
Що враховувати:
- пам'ять: tmpfs займає оперативну пам'ять і рахується в ліміт пам'яті контейнера. Без
sizeможна непомітно з'їсти половину пам'яті хоста; заповнений tmpfs при ліміті - OOM; - дані зникають при перезапуску - нічого, що має зберігатися;
- лише Linux-контейнери і не спільний між контейнерами (кожен має свій);
- права:
mode=1777для/tmp, інакше непривілейований користувач не зможе писати.
Для Laravel з файловою системою лише для читання: storage/framework/cache, storage/framework/views - у tmpfs чи томі, сесії й кеш - у Redis чи базі, логи - в stderr, завантажені файли - в S3/R2. Тоді коду застосунку взагалі не потрібен запис на диск.