Как добавить том в существующий контейнер Docker – CloudSavvy IT
Хотя Docker – полезный инструмент для упаковки приложений и управления ими, он также создает множество уникальных проблем, таких как работа с сохраненными данными. Обычно вы добавляете тома в контейнеры в сценарии создания, но что, если вам нужно создать новые?
Добавление тома в работающий контейнер Docker
К сожалению, это не так просто, как просто добавить новый том. Тома контейнеров должны быть настроены при запуске, что означает, что для добавления нового тома необходимо перезапустить контейнер. Хотя существует хакерское решение (подробнее об этом ниже), настоятельно рекомендуется перезапустить контейнер в любом случае.
Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)
На это есть несколько причин. Перезапустить контейнер довольно просто, и для большинства обновлений кода в любом случае требуется перезапуск службы. Отслеживание обновлений в Git – еще один важный фактор, особенно если вы используете Docker Compose, и редактирование сценария запуска намного лучше, чем добавление тома в работающий контейнер вручную.
Если ваша служба достаточно велика, что вас беспокоят несколько минут (самое большее) потенциального запланированного простоя для перезапуска контейнера, вам, вероятно, следует запустить масштабируемое развертывание с несколькими экземплярами, которые можно обновлять независимо. Современные системы автоматического масштабирования должны быть спроектированы так, чтобы справиться с этим, поскольку развертывание кода происходит часто.
Если вы хотите добавить том, вам нужно остановить работающий контейнер:
докер остановить my_container
Создайте новый том, если вам нужно:
том docker создать nginx-config
А затем запустите его с обновленной командой запуска, добавив флаг –mount для настройки исходного тома и целевого назначения.
docker run -d –name devtest –mount source = nginx-config, target = / etc / nginx nginx: latest
Если вы используете Docker Compose, вы можете легко автоматизировать и отслеживать этот процесс, поскольку конфигурация тома обрабатывается через файл настроек. вам нужно добавить том в файл docker-compose.yml:
версия: “3.0” сервисы: web: изображение: nginx: последние порты: – тома “80:80”: – / docker / nginx-config /: / etc / nginx /
Затем вы можете перезапустить службы Docker Compose. В Compose есть команда «перезапустить», но на самом деле она просто обновляет работающую службу без каких-либо изменений конфигурации. Если вы хотите обновить изображения, вам нужно запустить docker-compose up с флагом –build:
docker-compose up -d –build
Вы также можете вручную запустить docker-compose down заранее, чтобы остановить службы, но в большинстве случаев в этом нет необходимости, если вы не хотите запускать его с флагом -v для уничтожения существующих томов.
Клонирование из существующего контейнера
Практически во всех случаях вы не должны зависеть от текущего рабочего состояния контейнера. Все, что вам нужно, например данные приложения, должно храниться в томе, чтобы его можно было сохранить при перезапуске и перестроении контейнера.
Этот метод, вероятно, не является хорошей идеей для большинства людей, так как он требует, чтобы вы создавали новое изображение каждый раз, когда вы хотите это сделать, и он по-прежнему требует простоя. Но если вам действительно нужно добавить том в работающий контейнер, вы можете использовать docker commit, чтобы создать новый образ на основе этого контейнера, а затем клонировать его с новым томом.
Возьмите идентификатор контейнера из docker ps:
докер ps
А затем клонируйте его с помощью коммита:
docker commit f88f33c918d2 imagename
Затем вы можете запустить новый образ, заменив старый образ клонированным.
docker run -d –name devtest –mount source = nginx-config, target = / etc / nginx imagename
Хакерское решение
Тома Docker – это просто уловка, которую среда выполнения Docker использует для предоставления каталогов хоста контейнерам, и все зависит от конфигурации. Из-за этого вы можете напрямую изменить эту конфигурацию и перезапустить весь демон Docker, чтобы ваша система применила эти изменения без перезапуска вообще.
Конечно, это намного сложнее, чем просто иметь дело с перезапуском контейнера, поэтому, если вы можете управлять минутой простоя, мы настоятельно рекомендуем сделать это вместо этого.
Вам нужно будет перейти в каталог хранилища Docker:
cd / var / lib / docker / контейнеры
Здесь будет много папок, соответствующих идентификаторам контейнеров Docker, которые вы можете найти с помощью docker ps. Откройте контейнер, который хотите изменить.
Конфигурационный файл – config.v2.json, но он имеет компактный формат и его трудно редактировать. Вы можете установить jq для красивой печати JSON в командной строке и передать его в новый файл для редактирования:
jq. config.v2.json> tmp.json
Вам нужно будет прокрутить вниз, чтобы найти «MountPoints», который содержит конфигурацию для всех томов и привязок. Здесь вы можете добавить новый, который должен быть в следующем формате:
“MountPoints”: {“/ home / container”: {“Source”: “/ var / lib / pterodactyl / volume / c7fb3a04-e540-48a7-9704-13987f52e933”, “Destination”: “/ home / container”, ” RW “: true,” Name “:” “,” Driver “:” “,” Type “:” bind “,” Propagation “:” rprivate “,” Spec “: {” Type “:” bind “,” Source “:” / var / lib / pterodactyl / volume / c7fb3a04-e540-48a7-9704-13987f52e933 “,” Target “:” / home / container “},” SkipMountpointCreation “: true}},
Затем, как только это будет сделано, вы можете снова минимизировать JSON обратно в файл конфигурации:
jq -c. tmp.json> config.v2.json
jq – мощная утилита, поэтому, если вы хотите полностью автоматизировать этот процесс, вы можете это сделать.
Затем просто перезапустите службу Docker, чтобы изменения вступили в силу:
перезапуск докера службы sudo
Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)