如何向 Docker 容器傳遞引數

2021-09-01 10:23:27 字數 2759 閱讀 3039

原文:

我們在執行 docker 映象時希望能用下面的命令向容器傳遞命令列引數

docker run arg1 arg2

docker run arg1 arg2

其實只有第一種形式,緊隨映象名後那個總是乙個命令,其後才是引數。如果要向 docker 容器傳遞引數時,dockerfile 該如何寫,這就有必要稍稍了解一下 dockerfile 中  cmd 和 entrypoint 這兩個指令,並且它們有 exec 和 shell 兩種格式的寫法。詳情請見上篇 dockerfile 中命令的兩種書寫方式的區別。

對於乙個 docker 映象,我們可以這麼來理解  entrypoint 與 cmd 的關係

如果沒有定義 entrypoint, cmd 將作為它的 entrypoint

定義了 entrypoint 的話,cmd 只為 entrypoint 提供引數

cmd 可由docker run後的命令覆蓋,同時覆蓋引數

對於 #1 和  #2 更精緻的理解是容器執行的最終入口由 entrypoint 和實際的 cmd 拼接而成。entrypoint 和 cmd 需轉換為實際映象中的 exec 格式來拼接,合併後的第乙個元素是命令,其餘是它的引數。

一, 未定義 entrypoint, 定義了 cmd

#entrypoint

cmd ["echo", "hello"]

實際入口是它們拼接後還是 cmd 本身,["echo", "hello"]

二, 定義了 entrypoint 和 cmd

entrypoint ["echo", "hello"]

cmd ["echo", "world"]

實際入口是它們拼接起來,形成["echo", "hello", "echo", "world"], 執行docker run test顯示為hello echo world

三, 定義了 entrypoint, cmd 由docker run提供

entrypoint  ["echo", "hello"]

執行命令docker run rm -rf /, 實際入口是由["echo", "hello"]["rm", "-rf", "/"]拼接而成的["echo", "hello", "rm", "-rf", "/"], 輸出為hello rm -rf /。看到rm -rf /也不用擔心,用 entrypoint 就是讓人放心

注:entrypoint 同樣可以被覆蓋,如docker run --entrypoint ls test -l /,將會執行ls -l /命令。

四, 如果 entrypoint 用 shell 格式定義的

通過docker inspect命令看到映象中實際的 entrypoint 是

有了以上幾點概念,以及四個例項作為感觀認識後,想要怎麼往容器傳遞引數應該很容易確定了。

沒有定義 entrypoint 的映象想怎麼來就怎麼來,docker run後面的輸入你自己作主。

定義了 entrypoint 的映象,則是 cmd 或docker run後的輸入作為  entrypoint 中命令的附加引數。再次提醒 shell 格式的 entrypoint 和 cmd  務必要轉換為相應 exec  格式來理解。

如果是複雜的 shell 命令不容易拆解出乙個個引數,而希望用  shell 格式來定義 entrypoint 的話,也有辦法。shell 格式的 entrypoint 是由 "/bin/sh -c" 啟動的,而它是可以解析變數的。另一方面 cmd 或docker run的輸入第乙個元素存成了$0,其他剩餘元素存為$@, 所以 shell 格式的 entrypoint 可以這麼寫

entrypoint echo hello $0 $@

注:shell 中$0表示命令本身,$@為所有引數

這樣執行下面 docker 命令將可獲得所有的引數輸入

$ docker run test world and china

hello world and china

如果只是按常規 shell 指令碼來對待,想當然的寫成

entrypoint echo hello $@

效果將是

$ docker run test world and china

hello and china

第乙個引數將被丟失,docker run後第乙個輸入通常是乙個命令,所以是$0, 而 entrypoint 又希望它是乙個普通引數,因此$0 $@要同時寫上。

最簡單且準確的方式就是直接用docker inspect檢視實際啟動的命令及引數

如何向 Docker 容器傳遞引數

我們在執行 docker 映象時希望能用下面的命令向容器傳遞命令列引數 docker run arg1 arg2 docker run arg1 arg2 其實只有第一種形式,緊隨映象名後那個總是乙個命令,其後才是引數。如果要向 docker 容器傳遞引數時,dockerfile 該如何寫,這就有必...

向指令碼傳遞引數

start 在需要的時候我們可以向 perl 指令碼傳遞引數,perl 會自動將所有的引數放到陣列 argv 中,下面是乙個簡單的例子。usr bin perl use strict if argv 1 my name argv print welcome name n unix 的 cat 命令可...

向指令碼傳遞引數

1.使用 pg opt.sh bin sh opt.sh usage opt 1 processid 1 if ne 2 then usage exit 1 ficase opt in start start echo starting.processid stop stop echo stoppi...