2015-09-22 246 views
33

我是碼頭世界的新手。我必須調用一個shell腳本,它通過docker容器接受命令行參數。 例如:我的shell腳本的樣子:如何通過docker run將參數傳遞給Shell腳本

#!bin/bash 
echo $1 

Dockerfile看起來是這樣的:

FROM ubuntu:14.04 
COPY ./file.sh/
CMD /bin/bash file.sh 

我不知道怎麼樣,如果你想運行傳遞參數,同時運行的容器

回答

26

@ user1801934,你肯定@Gilles Quenot的答案是正確的嗎?

把arg1直接放到Dockerfile中,是你的請求嗎?

這是我的答案。

更新file.sh

#!/usr/bin/env bash 
echo $1 

使用存在Dockerfile

構建圖像:

docker build -t test . 

與參數abcxyz或別的東西運行圖像。

docker run -ti test /file.sh abc 

docker run -ti test /file.sh xyz 
+3

我認爲如果你不想讓最終用戶使用ENTRYPOINT,用戶直接瞭解file.sh。 –

+0

你怎麼才能啓動一個像'docker run -ti test /file.sh abc'這樣的腳本。我覺得腳本不會運行,因爲它應該是'docker run -ti test sh /file.sh abc'。 sh或/ bin/sh將運行正確。 –

+0

對於任何人來到這裏。/usr/bin/env技巧是可選的樣式首選項,並不需要使其工作。另外#!線表示使用購買默認的解釋器。所以它可以通過調用腳本來運行。 – wheredidthatnamecomefrom

4

它@build時間:

CMD /bin/bash /file.sh arg1 

如果你想運行它@run時間:

ENTRYPOINT ["/bin/bash"] 
CMD ["/file.sh", "arg1"] 

然後在主機外殼

docker build -t test . 
docker run -i -t test 
+1

'ENTRYPOINT'是誰,我認爲想要運行時OP一個很好的答案,但如果你真的想建立時間變量這個答案只是被打破。使用'ARG'和'docker build --build-arg' https://docs.docker.com/engine/reference/builder/#arg –

35

使用Docker,傳遞這類信息的正確方法是通過環境變量。

,以便具有相同Dockerfile,腳本改爲

#!/bin/bash 
echo $FOO 

建設後,請使用以下命令泊塢窗:

docker run -e FOO="hello world!" test 
+7

爲什麼這是最高的投票答案?環境變量是另一種傳遞信息的方式,但不是OP所要求的。當然OP的願望是將容器傳遞給容器絕對沒有任何不妥之處。 –

+2

@PartlyCloudy我認爲人們喜歡這個,因爲它聲稱給出了「正確的」答案,儘管顯然是錯誤的。 Docker的一個主要設計原則是優先考慮教條的常識。 – augurar

11

我有什麼是實際運行的東西的腳本文件。這個腳本文件可能相對複雜。我們稱之爲「run_container」。該腳本接受參數的命令行:

run_container p1 p2 p3 

簡單run_container可能是:

#!/bin/bash 
echo "argc = ${#*}" 
echo "argv = ${*}" 

我想要做的是,「dockering」這一點,我想能夠啓動這個後與搬運工命令行上的參數,如此容器:

docker run image_name p1 p2 p3 

和已在run_container腳本可以與P1 P2 P3作爲參數運行。

這是我的解決方案:

Dockerfile:

FROM docker.io/ubuntu 
ADD run_container/
ENTRYPOINT ["/bin/bash", "-c", "/run_container ${*}", "--"] 
+4

用'「/ run_container \」替換'ENTRYPOINT'數組中的第三個值$ @ \「」'表示包含空格的參數被正確處理(例如'docker run image_name foo'bar baz'quux')。 – davidchambers

25

這個腳本在file.sh

#!/bin/bash 
echo Your container args are: "[email protected]" 

Dockerfile

FROM ubuntu:14.04 
COPY ./file.sh/
ENTRYPOINT ["/file.sh"] 
CMD [] 

你應該能夠:

% docker build -t test . 
% docker run test hello world 
Your container args are: hello world 
+1

如果您像我一樣忘記了「/ file.sh」周圍的「」,它將不起作用。 – kev

相關問題