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

Возникло давеча у меня желание запустить контейнер 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 не будет опубликован.