Как настроить автоматическое удаление volum-а после остановки контейнера в Docker?
Как известно, одной из важных задач в технологии Docker является обеспечение сохранности и переиспользования данных между старыми и новыми контейнерами, и эта задача имеет несколько решений. А как быть если всё-таки нужно, чтобы данные стирались после остановки контейнера?
С напрашивающимся ответом "Вообще не создавать никаких volume-ов и монтировок" не всё так просто. При копировании файлов (скажем, с помощью COPY . /var/www/example
в Dockerfile) в списке Volum-ов что-то появится, хотя говорят, это не Volume. Подробно это явление было рассмотрено вопросе Как переименовать создаваемый автоматически Docker volume?, а пока могу сказать, что это "что-то" во-первых, автоматически не удалится, а во вторых, имеет непонятное имя типа b8e00e114ac2d57b5907e0bd75cb046721b50eeff5d74f12a
.
Предвижу также вопрос: "Что это у тебя за такой случай?". У меня вот такая структура проекта (просто сайт с клиентской и серверной частью на Node.js):
Обращаю внимание, что исходного кода в этой структуре нет - это собранный проект, а package.json, который там - это не основной package.json проекта, где указаны вообще все зависимости (для клиентской части, серверной части и режима локальной разработки), а урезанная версия этого файла с мeтаданными, где указаны только зависимости для серверной части и нечего больше.
После загрузки всех этих файлов на сервер с помощью rsync, я собираюсь скопировать все эти файлы в Docker-volume, запустить в контейнере npm install
, а потом и серверное приложение. В volum-e должна появиться директория node_modules
с кучей подпапок и файлов. Никаких данных, полученных от пользователей, в volum-е не хранится (для базы данных у меня отдельный, на сей раз переиспользуемый volume); после остановки контейнера этот volume с файлами приложения и зависимостями можно безопасно удалить.
В следующей сборке зависимости могут измениться, но там уже будет новый volum-е и чистая установка зависимостей.
Текущее содержимое docker-compose.yaml
и FrontServer.Dockerfile
Следующим шагом я хочу оставить только docker-compose.yaml
, но это уже будет другой вопрос.
docker-compose.yaml
version: "3"
services:
front_server:
container_name: Example-Production-FrontServer
build:
context: .
dockerfile: "FrontServer.Dockerfile"
ports: [ "8080:8080" ]
depends_on: [ Database ]
Database:
// Не имеет отношения к данному вопросы
FrontServer.Dockerfile
FROM node:16-alpine
WORKDIR /var/www/example.com
COPY . /var/www/example.com
RUN npm install --no-package-lock
CMD [ "node", "FrontServerEntryPoint.js", "--environment", "production" ]
Почему я не хочу использовать обычное монтирование директории и package.lock.json?
Основная причина - синхронизация файлов сборки с помощью rsync.
Чтобы старые и новые файлы не перемешивались, я буду использовать опцию --delete
, которая будет удалять все файлы с именами, которых нет среди загружаемых. Соответственно, при загрузке файлов директория node_modules
на сервере будет удалена, что убьёт уже запущенное в контейнере приложение.
Поэтому, копирование загруженных файлов в volum-e и чистая установка зависимостей - вполне себе безопасное решение. Осталось только решить вопрос с автоматическим удалением устаревшего volum-а после остановки контейнера.
Кстати, про существование package.lock.json
я знаю, но у меня все версии зависимостей в package.json
точные - без ^
и ~
. По всем этим причинам, не вижу смысла в package.lock.json
при установке зависимостей на сервере (локальная разработка - другой разговор) и использовать его не буду.