docker run: por que usar --rm (docker newbie)

104

Estou testando o docker pela primeira vez e ainda não tenho um "modelo mental". Iniciante total.

Todos os exemplos que estou vendo incluem a --rmsinalização para execução, como

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

Questão:

Por que esses comandos incluem o --rmsinalizador? Eu pensaria que, se eu tivesse o trabalho de configurar ou baixar um contêiner com coisas boas nele, por que removê-lo? Quero mantê-lo para usar novamente.

Então, eu sei que tenho uma ideia errada do docker.

momentos correspondentes
fonte
5
--rmremove o contêiner interrompido (aquele que docker runcria), não a imagem na qual ele foi baseado (o que você baixou).
Ry-
docker run --helpdeve ser útil. Se você não quiser remover o contêiner , pode
aprová-
1
deve ser --rme é para limpar automaticamente o contêiner e remover o sistema de arquivos quando o contêiner sair e não significa remover as coisas do contêiner.
Mahattam,
2
Você não baixa contêineres, você baixa imagens. Leia aqui para aprender as diferenças entre imagens e contêineres: docs.docker.com/engine/docker-overview/#docker-objects
axiac

Respostas:

94

Os contêineres são apenas uma instância da imagem que você usa para executá-los. O estado de espírito ao criar um aplicativo em contêiner não é pegar um contêiner ubuntu novo e limpo, por exemplo, e fazer o download dos aplicativos e configurações que você deseja ter nele e depois deixá-lo rodar.

Você deve tratar o contêiner como uma instância de seu aplicativo, mas seu aplicativo está embutido em uma imagem. O uso adequado seria a criação de uma imagem personalizada, onde você incorpora todos os seus arquivos, configurações, variáveis ​​de ambiente, etc., na imagem. Leia mais sobre o Dockerfile e como isso é feito aqui

Depois de fazer isso, você tem uma imagem que contém tudo e, para usar seu aplicativo, basta executar a imagem com as configurações de porta adequadas ou outras variáveis ​​dinâmicas, usando docker run <your-image>

Executar contêineres com --rmsinalização é bom para aqueles contêineres que você usa por muito tempo apenas para realizar algo, por exemplo, compilar seu aplicativo dentro de um contêiner, ou apenas testar algo que funciona, e então você saberá que é um contêiner de curta duração e você diga ao seu daemon do Docker que, uma vez executado, apague tudo relacionado a ele e economize espaço em disco.

camarada123
fonte
Passar as variáveis ​​de ambiente para o docker run seria uma alternativa melhor. Desta forma, você pode começar com diferentes configurações (por exemplo, produção versus pré-produção)?
SCO de
O ambiente Prod vs Test é um bom exemplo em que você provavelmente gostaria de usar env vars para fazer a separação e fazer seu aplicativo rodar a partir da mesma imagem, mas com configurações diferentes para cada env
buddy123
Existe uma maneira de excluir automaticamente os contêineres que são iniciados --rmquando o usuário fecha a janela do terminal. ou seja, não é executado deliberadamente exitno shell do contêiner, mas apenas fecha a janela da GUI do terminal. Percebi que os contêineres não são excluídos neste caso.
venkrao
20

O sinalizador --rmé usado quando você precisa que o contêiner seja excluído após a conclusão da tarefa.

Isso é adequado para pequenos testes ou fins de POC e evita a dor de cabeça para tarefas domésticas.

Adnan Khan
fonte
16

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

Por padrão, o sistema de arquivos de um contêiner persiste mesmo após a saída do contêiner. Isso torna a depuração muito mais fácil (já que você pode inspecionar o estado final) e você retém todos os seus dados por padrão. Mas se você estiver executando processos de primeiro plano de curto prazo, esses sistemas de arquivos de contêiner podem realmente se acumular. Se, em vez disso, você quiser que o Docker limpe automaticamente o contêiner e remova o sistema de arquivos quando o contêiner sair, você pode adicionar a sinalização --rm

Resumindo: é útil manter o host limpo de contêineres parados e não usados.

Sandro Modarelli
fonte
1

Eu uso --rmao me conectar a contêineres em execução para realizar algumas ações, como backup de banco de dados ou cópia de arquivo. Aqui está um exemplo:

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

O procedimento acima conectará um contêiner em execução chamado 'app_postgres_1' e criará um backup. Assim que o comando de backup for concluído, o contêiner será totalmente excluído.

Shoan
fonte