docker run: навіщо використовувати --rm (docker newbie)


105

Я вперше пробую докер і ще не маю "ментальної моделі". Всього новачок.

Усі приклади, на які я дивлюся, включали --rmпрапор, який слід виконувати, наприклад

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

Питання:

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

Отже, я знаю, що у мене неправильна ідея докера.


5
--rmвидаляє зупинений контейнер (той, який docker runстворюється), а не зображення, на якому він був заснований (те, що ви завантажили).
Ry-

docker run --helpмає бути корисним. Якщо ви не хочете видалити контейнер , можете передати його
indapublic

1
це повинно бути, --rmі це автоматично очищати контейнер і видаляти файлову систему, коли контейнер виходить, і це не означає, що вилучати речі з контейнера.
Махаттам

2
Ви не завантажуєте контейнери, ви завантажуєте зображення. Читайте тут, щоб дізнатися про відмінності між зображеннями та контейнерами: docs.docker.com/engine/docker-overview/#docker-objects
axiac

Відповіді:


95

Контейнери - це лише екземпляр зображення, яке ви використовуєте для їх запуску. Стан душі при створенні контейнерного додатка полягає не в тому, щоб взяти, наприклад, свіжий чистий контейнер ubuntu, а також завантажити додатки та конфігурації, які ви хочете мати в ньому, а потім дозволити його запускати.

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

Як тільки ви це зробили, у вас є зображення, яке містить усе, і для того, щоб використовувати свою програму, ви просто запускаєте зображення з належними налаштуваннями портів або іншими динамічними змінними, використовуючи docker run <your-image>

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


Передача змінних оточуючих середовищ до докера буде кращою альтернативою. Таким чином ви можете почати з різних конфігурацій (наприклад, виробництво порівняно з попередньою продукцією)?
ШОС

Навколишнє середовище Prod vs Test є хорошим прикладом, коли ви, ймовірно, хочете використовувати env vars для розмежування та змусити ваш додаток працювати з одного і того ж зображення, але з різними налаштуваннями для кожного 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" та створить резервну копію. Після завершення команди резервного копіювання контейнер повністю видаляється.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.