docker run: зачем использовать --rm (новичок в докере)

110

Пробую докер первый раз и еще не имею "ментальной модели". Всего новичок.

Все примеры, которые я рассматриваю, включают --rmфлаг для запуска, например

docker run -it --rm ...
docker container run -it --rm ...

Вопрос:

Почему эти команды включают --rmфлаг? Я бы подумал, что если бы мне пришлось столкнуться с проблемой настройки или загрузки контейнера с хорошими вещами в нем, зачем его удалять? Я хочу сохранить его, чтобы использовать снова.

Итак, я знаю, что у меня неправильное представление о докере.

совпадающие моменты
источник
6
--rmудаляет остановленный контейнер (тот, который docker runсоздается), а не образ, на котором он был основан (то, что вы скачали).
Ry-
docker run --helpдолжно быть полезно. Если вы не хотите удалять контейнер , вы можете передать его
indapublic
1
это должно быть, --rmи оно должно автоматически очищать контейнер и удалять файловую систему при выходе из контейнера, и это не означает удаление материала из контейнера.
Махаттам
2
Вы не загружаете контейнеры, вы загружаете изображения. Прочтите здесь, чтобы узнать о различиях между изображениями и контейнерами: docs.docker.com/engine/docker-overview/#docker-objects
axiac

Ответы:

98

Контейнеры - это просто экземпляр образа, который вы используете для их запуска. Настроение при создании контейнерного приложения заключается не в том, чтобы, например, взять свежий чистый контейнер ubuntu и загрузить в него приложения и конфигурации, которые вы хотите иметь, а затем позволить ему работать.

Вы должны рассматривать контейнер как экземпляр вашего приложения, но ваше приложение встроено в изображение. Правильным использованием будет создание пользовательского образа, в который вы вставляете все свои файлы, конфигурации, переменные среды и т. Д. В образ. Подробнее о Dockerfile и о том, как это делается, читайте здесь.

Как только вы это сделаете, у вас будет образ, содержащий все, и для использования вашего приложения вы просто запустите образ с правильными настройками порта или другими динамическими переменными, используя docker run <your-image>

Запуск контейнеров с --rmфлагом хорош для тех контейнеров, которые вы используете очень короткое время, просто чтобы что-то сделать, например, скомпилировать свое приложение внутри контейнера или просто протестировать что-то, что оно работает, а затем вы знаете, что это недолговечный контейнер, и сообщите своему демону Docker, что после его завершения удалите все, что с ним связано, и сэкономьте место на диске.

приятель123
источник
Лучшей альтернативой будет передача переменных среды в docker run. Таким образом, вы можете начать с разных конфигураций (например, производственная или предварительная подготовка)?
SCO
Среда Prod vs Test - хороший пример, в котором вы, вероятно, захотите использовать переменные env для разделения и запуска приложения из одного и того же образа, но с разными настройками для каждого env
buddy123
Есть ли способ автоматически удалять контейнеры, которые запускаются, --rmкогда пользователь закрывает окно терминала. т.е. не запускается намеренно exitв оболочке контейнера, а просто закрывает окно графического интерфейса терминала. Я заметил, что контейнеры в этом случае не удаляются.
Venkrao
20

Флаг --rmиспользуется, когда вам нужно удалить контейнер после завершения задачи для него.

Это подходит для небольших испытаний или для целей POC и избавляет от головной боли при домашнем хозяйстве.

Аднан Хан
источник
16

с https://docs.docker.com/engine/reference/run/#clean-up---rm

По умолчанию файловая система контейнера сохраняется даже после выхода из контейнера. Это значительно упрощает отладку (поскольку вы можете проверить конечное состояние), и вы сохраняете все свои данные по умолчанию. Но если вы запускаете краткосрочные процессы переднего плана, эти файловые системы контейнеров действительно могут накапливаться. Если вместо этого вы хотите, чтобы Docker автоматически очищал контейнер и удалял файловую систему при выходе из контейнера, вы можете добавить флаг --rm

Вкратце: полезно держать хост в чистоте от остановленных и неиспользуемых контейнеров.

Сандро Модарелли
источник
1

Я использую --rmпри подключении к запущенным контейнерам для выполнения некоторых действий, таких как резервное копирование базы данных или копирование файлов. Вот пример:

docker run -v $(pwd):/mnt --link app_postgres_1:pg --rm postgres:9.5 pg_dump -U postgres -h pg -f /mnt/docker_pg.dump1 app_db

Вышеупомянутое соединение подключит работающий контейнер с именем app_postgres_1 и создаст резервную копию. После завершения команды резервного копирования контейнер полностью удаляется.

Шоан
источник