Запуск контейнеров и сохранение данных — Примеры
Пример 1 — Данные, переживающие записавший их контейнер
Задание пишет файл отчёта рядом со своим кодом, и после повторного развёртывания команда не может найти отчёт. Команды ниже запускают задание, удаляют контейнер и запускают его снова. Измените запуск так, чтобы при втором старте файл, записанный первым, был на месте.
docker run --name report-job myjob:1.0
docker rm report-job
docker run --name report-job myjob:1.0
# отчёт, записанный первым запуском, исчез
Решение
docker volume create reports
docker run --name report-job --mount source=reports,target=/data myjob:1.0
docker rm report-job
docker run --name report-job --mount source=reports,target=/data myjob:1.0
# итог: второй запуск читает report.csv, записанный первым
Именованный том лежит вне записываемого слоя, поэтому удаление и повторное создание контейнера оставляют отчёт на месте. Записываемый слой — тонкий слой поверх образа, и он отбрасывается вместе с контейнером, поэтому в исходном варианте файл пропадал. Ошибка — подключить каталог, в который задание не пишет: монтирование должно накрывать тот путь, которым задание действительно пользуется. Данные, нужные сразу нескольким контейнерам, живут в управляемом сервисе, а том остаётся для кэшей и временного места.
Пример 2 — Имя, которое не разрешается, и отказ, завершающийся с нулём
Разовый контейнер миграции подключается к базе данных и завершается. В сети по умолчанию он не может разрешить имя базы, а когда миграция падает, он всё равно завершается с нулём, и окружающая система рапортует об успешном прогоне. Исправьте обе проблемы.
docker run --name db mydb:1.0
docker run --rm --env DB_HOST=db mymigrate:1.0
# could not resolve host: db
# container exited 0 - reported as success
Решение
docker network create app-net
docker run -d --name db --network app-net mydb:1.0
docker run --rm --network app-net --env DB_HOST=db mymigrate:1.0
# миграция находит db по имени контейнера в сети app-net
# при отказе: код 1 -> срабатывает политика перезапуска или оповещение
Пользовательская сеть поднимает службу имён, которая сопоставляет имена контейнеров адресам, поэтому db разрешается; сеть по умолчанию такого сопоставления не даёт и находит контейнеры только по адресу. Код возврата — единственный сигнал, который читает окружающая система: ноль означает успех, поэтому миграция, проглотившая свою ошибку, была бы неотличима от отработавшей, и ни перезапуск, ни оповещение никогда бы не сработали. Ошибка — считать это сбоем базы данных и не проверить, в какую сеть вошли контейнеры.