docker run: por qué usar --rm (docker novato)

105

Estoy probando Docker por primera vez y todavía no tengo un "modelo mental". Principiante total.

Todos los ejemplos que estoy viendo han incluido la --rmbandera para ejecutar, como

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

Pregunta:

¿Por qué estos comandos incluyen la --rmbandera? Pensaría que si tuviera que tomarme la molestia de configurar o descargar un contenedor con las cosas buenas, ¿por qué eliminarlo? Quiero conservarlo para volver a usarlo.

Entonces, sé que tengo una idea equivocada de Docker.

momentos coincidentes
fuente
5
--rmelimina el contenedor detenido (el que docker runcrea), no la imagen en la que se basó (lo que descargó).
Ry-
docker run --helpdebería ser útil. Si no desea eliminar el contenedor , puede pasarlo
indapublic
1
debe ser --rmy es para limpiar automáticamente el contenedor y eliminar el sistema de archivos cuando el contenedor sale y no significa quitar las cosas del contenedor.
Mahattam
2
No descargas contenedores, descargas imágenes. Lea aquí para conocer las diferencias entre imágenes y contenedores: docs.docker.com/engine/docker-overview/#docker-objects
axiac

Respuestas:

95

Los contenedores son simplemente una instancia de la imagen que usa para ejecutarlos. El estado mental al crear una aplicación en contenedor no es tomar un contenedor ubuntu nuevo y limpio, por ejemplo, y descargar las aplicaciones y configuraciones que desea tener en él, y luego dejar que se ejecute.

Debe tratar el contenedor como una instancia de su aplicación, pero su aplicación está incrustada en una imagen. El uso adecuado sería crear una imagen personalizada, en la que incrustar todos sus archivos, configuraciones, variables de entorno, etc., en la imagen. Lea más sobre Dockerfile y cómo se hace aquí.

Una vez que hizo eso, tiene una imagen que contiene todo, y para usar su aplicación, simplemente ejecute la imagen con la configuración de puerto adecuada u otras variables dinámicas, usando docker run <your-image>

Ejecutar contenedores con --rmbandera es bueno para aquellos contenedores que usa por muy poco tiempo solo para lograr algo, por ejemplo, compilar su aplicación dentro de un contenedor, o simplemente probar algo que funciona, y luego sabe que es un contenedor de corta duración y usted dígale a su demonio Docker que una vez que termine de ejecutarse, borre todo lo relacionado con él y ahorre espacio en el disco.

buddy123
fuente
¿Pasar las variables de entorno a Docker Run sería una mejor alternativa? ¿De esta manera puede comenzar con diferentes configuraciones (por ejemplo, producción versus preproducción)?
SCO
Prod vs Test environment es un buen ejemplo en el que probablemente desee usar env vars para hacer la separación y hacer que su aplicación se ejecute desde la misma imagen, pero con diferentes configuraciones para cada env
buddy123
¿Hay alguna manera de eliminar automáticamente los contenedores que se comienzan a usar --rmcuando el usuario cierra la ventana de la terminal? es decir, no se ejecuta deliberadamente exiten el shell contenedor, sino que simplemente cierra la ventana GUI del terminal. He notado que los contenedores no se eliminan en este caso.
Venkrao
20

La bandera --rmse usa cuando necesita que se elimine el contenedor después de que se complete la tarea.

Esto es adecuado para pequeñas pruebas o propósitos POC y ahorra el dolor de cabeza para el mantenimiento de la casa.

Adnan Khan
fuente
16

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

De forma predeterminada, el sistema de archivos de un contenedor persiste incluso después de que el contenedor sale. Esto hace que la depuración sea mucho más fácil (ya que puede inspeccionar el estado final) y conserva todos sus datos de forma predeterminada. Pero si está ejecutando procesos de primer plano a corto plazo, estos sistemas de archivos de contenedor realmente pueden acumularse. Si, en cambio, desea que Docker limpie automáticamente el contenedor y elimine el sistema de archivos cuando el contenedor salga, puede agregar la marca --rm

En pocas palabras: es útil mantener el host limpio de contenedores detenidos y no utilizados.

Sandro Modarelli
fuente
1

Utilizo --rmcuando me conecto a contenedores en ejecución para realizar algunas acciones como la copia de seguridad de la base de datos o la copia de archivos. Aquí hay un ejemplo:

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

Lo anterior conectará un contenedor en ejecución llamado 'app_postgres_1' y creará una copia de seguridad. Una vez que se completa el comando de copia de seguridad, el contenedor se elimina por completo.

Shoan
fuente