Как настроить автоматическое удаление volum-а после остановки контейнера в Docker?

Рейтинг: 0Ответов: 1Опубликовано: 20.01.2023

Как известно, одной из важных задач в технологии 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 при установке зависимостей на сервере (локальная разработка - другой разговор) и использовать его не буду.

Ответы

▲ 1Принят

Промежуточный volume удаляется вместе с удалением контейнера. Также удалится при пересборке контейнера поверх старого если изменилась метка времени на файлах.