Контейнеры — стейтлес, говорили они

Возникло давеча у меня желание запустить контейнер SonarQube.

В гугле меня не забанили, поэтому быстренько была найдена ссылка по запуску  контейнера за пару минут.

Я взял оттуда команду для запуска контейнера:

Запустил контейнер, сменил пароль пользователя admin, зарегистрировал Gitlab и добавил репозиторий с кодом в качестве проекта.

Затем я остановил контейнер:

Когда мне снова потребовался контейнер SonarQube, я запустил его командой

Каково же было мое удивление, когда контейнер запустился со всеми изменениями (пароль администратора и прочее).

Хочу воспользоваться подсказкой «Помощь зала»: как вы считаете, уважаемые читатели — почему контейнер после перезапуска сохранил свое состояние?

Контейнеры — стейтлес, говорили они: 3 комментария

  1. Привет, Андрей.

    Так контейнер был просто выключен, его волюмы то не удалялись по этому изменения в них сохранились. Но если например выдет новая версия и ты сделаешь docker pull, то скачается новый image этого контейнера и при запуске старый удалится (вместе с волюмами, кроме persistent volumes) а новый будет создан из нового image. Если хочешь что бы каждый раз у тебя был «новый» контейнер используй опцию —rm, тогда при остановке контейнера он будет уничтожаться.

    docker run -d —rm —name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest

    Полагаю так.

    1. Привет, Александр.
      В точку: у каждого контейнера есть персональный writeable-слой, куда пишутся все изменения (отличия от образа).
      Создается этот слой при запуске контейнера из образа, удаляется только при удалении самого контейнера (например, docker rm или docker run -rm).
      Если сделать docker stop name|id && docker start name|id, слой сохраняется, что можно увидеть с помощью docker ps -s (для включенных контейнеров) или docker ps -a -s (для всех контейнеров).
      Виртуальный размер — образ, все остальное — writable-слой.
      Вывод: как только вы дали контейнеру имя (—name sonarqube), он перестал быть стейтлес )))

      1. Гарантировать сохранение своего state контейнер не может, а значит он stateless. То что он сохранил данные между остановкой и последующим стартом это нормально — остановка и старт это часть его жизненного цикла. Стейт же это состояние контейнера в течение его жизненного цикла, после окончания оного стейт теряется. Так что тут не соврали, все ок.

Добавить комментарий для Андрей Вахитов Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *