正確使用dockerfile中的entrypoint命令
如何正確地構建docker映象,對於正確使用docker是非常關鍵的。如果你想要定義容器需要執行的命令,而將命令列引數留給使用者提供,則使用dockerfile中的entrypoint命令是十分方便的。
作為演示,我們假設乙個簡單的場景:公司的伺服器需要定期清理舊的日誌檔案。這雖然是乙個簡單的管理任務,但是非常容易出錯,管理員可能會不小心刪除了錯誤的檔案。所以可以使用乙個docker映象來包裝管理員執行的命令,降低這種問題出現的風險。
下面這段指令碼刪除/log_dir目錄中久於某天的日誌,天數作為命令列引數傳遞進來:
vim clean_log
#!/bin/bash
echo "cleaning logs over $1 days old"
find /log_dir -ctime "$1" -name '*log' -exec rm {} \;
下面在與上面指令碼相同的目錄下建立dockerfile,以上面的指令碼作為entrypoint:
from ubuntu:14.04
add clean_log /usr/bin/clean_log #將之前下好的clean_log指令碼新增到映象中
run chmod +x /usr/bin/clean_log
entrypoint ["/usr/bin/clean_log"] #將此映象的入口點定義為clean_log指令碼
cmd ["7"] #設定entrypoint命令的預設引數是7天
上面**第2行將前面的指令碼新增進映象;第4行定義了映象的預設執行的指令碼命令;第5行定義了預設指令碼命令的引數(7天)。
entrypoint和cmd的最佳實踐——總是使用陣列形式的寫法:如果你經常在docker hub上檢視別人的dockerfile,會發現陣列模式(例如 cmd [「/usr/bin/command」])會比shell模式用得更多(cmd /usr/bin/command)。這是因為shell模式會自動在你提供的命令前面新增乙個/bin/bash -c命令,這可能會導致意外的結果。不過有時shell模式更加有用。
使用如下命令構建映象:
$ docker build -t log-cleaner .
entrypoint和cmd的區別經常使人迷惑。理解的關鍵點是知道當乙個映象啟動時,entrypoint總是被執行,即使在docker run命令後指定了映象要執行的命令。如果是這樣的話,這個命令會被認為是entrypoint的引數,替換掉cmd中的預設引數。
例如上面構建的映象,如果這樣執行docker run -it log-cleaner /bin/bash的話,並不會執行bash,而是將/bin/bash作為引數傳遞給指令碼(這裡替換掉了預設的7這個引數)。系統會提示錯誤的引數:
$ docker run -it log-cleaner /bin/bash
cleaning logs over /bin/bash days old
find: invalid argument '-name' to '-ctime'
正確的使用方法如下: Docker 技巧之刪除Docker容器和映象
公司業務在生產環境100多台伺服器上用了docker,已經有大半年了,可是最近發現,每個伺服器上的各種映象好多好亂,就想批量刪除映象,需要的來看一下把。刪除所有未執行 docker 容器 docker rm docker ps a q 刪除所有 docker 映象 刪除所有未打 tag 的映象 do...
docker中的小技巧
這篇文章下的指令都是我在工作年中常用到的一些操縱docker中container的小技巧。docker run rm name auto exit test busybox latest echo hello world使用 read only標誌建立容器時,會將掛載的容器檔案系統設定為唯讀,防止容...
docker學習之docker命令
在csdn的第一篇文章,排版之類的慢慢研究,先把內容充實上去,菜雞起步,坐穩扶好了 首先我們要牢記並善於使用乙個最最最重要的命令 docker help help這個選項大家都知道是幹嘛的吧,不會help一下,這個在docker的命令分支中也賊好用,例如關於docker image可以幹那些事就可以...