一、docker run 的 --rm 選項的作用
Docker容器進程有兩種運行模式。
1、前台模式(默認) —— foreground 容器
docker run ... // 或
docker run -d=false ...
注意,只有在前台模式下,才有必要設置-it命令選項,為容器設置偽TTY
2、后台模式(也稱detached模式)
docker run -d ... // 或
docker run -d=true ...
注意,只要有-d命令選項,就沒有-it命令選項。
當我們啟動一個container時,首先需要確定這個container是運行在前台模式還是運行在后台模式。
(1)Detached (-d)
如果在 docker run 后面追加 -d=true 或者 -d,則containter將會運行在后台模式(Detached mode)。此時所有I/O數據只能通過網絡資源或者共享卷組來進行交互。因為container不再監聽你執行docker run的這個終端命令行窗口。但你可以通過執行docker attach 來重新掛載這個container里面。
需要注意的是,如果你選擇執行-d使container進入后台模式,那么將無法配合"--rm"參數。
(2)Foregroud
如果在docker run后面沒有追加-d參數,則container將默認進入前台模式(Foregroud mode)。Docker會啟動這個container,同時將當前的命令行窗口掛載到container的標准輸入,標准輸出和標准錯誤中。也就是container中所有的輸出,你都可以再當前窗口中查看到。甚至docker可以虛擬出一個TTY窗口,來執行信號中斷。這一切都是可以配置的:
-a=[] : Attach to `STDIN`, `STDOUT` and/or `STDERR` -t=false : Allocate a pseudo-tty --sig-proxy=true : Proxify all received signal to the process (non-TTY mode only) -i=false : Keep STDIN open even if not attached
如果在執行run命令時沒有指定-a,那么docker默認會掛載所有標准數據流,包括輸入輸出和錯誤。你可以特別指定掛載哪個標准流。
sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash (只掛載標准輸入輸出)
對於執行容器內的交互式操作,例如shell腳本。我們必須使用 -i -t 來申請一個控制台同容器進行數據交互。
二、docker run 的 --rm 選項的作用
在Docker容器退出時,默認容器內部的文件系統仍然被保留,以方便調試並保留用戶數據。但是,對於foreground容器,由於其只是在開發調試過程中短期運行,其用戶數據並無保留的必要,因而可以在容器啟動時設置 --rm 選項,這樣在容器退出時就能夠自動清理容器內部的文件系統。示例如下:
docker run --rm ba-208
// 等價於
docker run --rm=true ba-208
顯然,--rm 選項不能與 -d 同時使用(或者說同時使用沒有意義),即只能自動清理 foreground 容器,不能自動清理 detached 容器。
注意,--rm 選項也會清理容器的匿名data volumes。
所以,執行 docker run 命令帶 --rm 命令選項,等價於在容器退出后,執行docker rm -v。
三、docker的 --rm 與 docker rm 的區別
Dockerfile里的VOLUME和docker run -v /path的時候掛載容器的掛載點效果是一致的,會在宿主機/var/lib/docker/volumes目錄生成隨機目錄。
1、使用 docker rm 刪除容器 —— 刪除容器,掛載點的文件還存在
2、使用 --rm 參數 —— 刪除容器,並還會刪掉掛載點的數據
