Возникло давеча у меня желание запустить контейнер SonarQube.
В гугле меня не забанили, поэтому быстренько была найдена ссылка по запуску контейнера за пару минут.
Я взял оттуда команду для запуска контейнера:
1 |
docker run -d --name sonarqube -e SONAR_ES_BOOTSTRAP_CHECKS_DISABLE=true -p 9000:9000 sonarqube:latest |
Запустил контейнер, сменил пароль пользователя admin, зарегистрировал Gitlab и добавил репозиторий с кодом в качестве проекта.
Затем я остановил контейнер:
1 |
docker stop sonarqube |
Когда мне снова потребовался контейнер SonarQube, я запустил его командой
1 |
docker start sonarqube |
Каково же было мое удивление, когда контейнер запустился со всеми изменениями (пароль администратора и прочее).
Хочу воспользоваться подсказкой “Помощь зала”: как вы считаете, уважаемые читатели – почему контейнер после перезапуска сохранил свое состояние?
Привет, Андрей.
Так контейнер был просто выключен, его волюмы то не удалялись по этому изменения в них сохранились. Но если например выдет новая версия и ты сделаешь 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
Полагаю так.
Привет, Александр.
В точку: у каждого контейнера есть персональный writeable-слой, куда пишутся все изменения (отличия от образа).
Создается этот слой при запуске контейнера из образа, удаляется только при удалении самого контейнера (например, docker rm или docker run -rm).
Если сделать docker stop name|id && docker start name|id, слой сохраняется, что можно увидеть с помощью docker ps -s (для включенных контейнеров) или docker ps -a -s (для всех контейнеров).
Виртуальный размер – образ, все остальное – writable-слой.
Вывод: как только вы дали контейнеру имя (–name sonarqube), он перестал быть стейтлес )))
Гарантировать сохранение своего state контейнер не может, а значит он stateless. То что он сохранил данные между остановкой и последующим стартом это нормально – остановка и старт это часть его жизненного цикла. Стейт же это состояние контейнера в течение его жизненного цикла, после окончания оного стейт теряется. Так что тут не соврали, все ок.