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

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

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

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

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

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

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

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

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

3 thoughts on “Контейнеры – стейтлес, говорили они”

  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. То что он сохранил данные между остановкой и последующим стартом это нормально – остановка и старт это часть его жизненного цикла. Стейт же это состояние контейнера в течение его жизненного цикла, после окончания оного стейт теряется. Так что тут не соврали, все ок.

Leave a Reply

Your email address will not be published. Required fields are marked *