2017-02-02 46 views
6

我想在碼頭執行兩個命令。具體來說,我必須在特定目錄內運行一個命令。 我想這一點,butit沒有工作:未檢測執行兩個命令與碼頭執行

docker exec [id] -c 'cd /var/www/project && composer install' 

參數-c。 我也試過這樣:

docker exec [id] cd /var/www/project && composer install 

但命令composer installdocker exec命令後執行。 我該怎麼辦?

+1

你嘗試:'搬運工EXEC [ID] /斌/慶典-c「CD /無功/網絡/項目&&作曲家安裝'' –

+0

感謝老兄,我沒有看到你的評論,但它的工作! –

回答

12

在第一個示例中,您將-c標誌設置爲docker exec。這是一個簡單的答案:docker exec沒有-c標誌。

在第二個示例中,在Docker甚至發現它之前,shell將它解析爲兩個命令。這是相同的:

if docker exec [id] cd /var/www/project 
then 
    composer install 
fi 

首先,docker exec運行,如果它退出0(成功),composer install將嘗試運行本地,泊塢窗之外。

您需要做的是將兩個命令作爲單個參數傳遞給docker exec使用字符串。然後,它們將不會被shell解釋,直到已經在容器內。

docker exec [id] "cd /var/www/project && composer install" 

但是,正如你在評論中指出的那樣,這也行不通。這是因爲cd是一個內置的shell,並不存在。嘗試執行它作爲初始命令將失敗。所以下一步就是把它交給一個shell來執行。

docker exec [id] "bash -c 'cd /var/www/project && composer install'" 

最後,在這一點上&&已移動到內部的一組引號的,所以我們並不真正需要圍繞bash命令引號...如果你喜歡,你可以刪除它們。

docker exec [id] bash -c 'cd /var/www/project && composer install' 
+0

嗨,我試過你的命令,它不工作,這是顯示的錯誤: rpc錯誤:code = 2 desc = oci運行時錯誤:exec失敗:container_linux.go:247:啓動容器進程導致「exec:\」cd/var/www/project && composer install \「:stat cd/var/www/project &&作曲者安裝:沒有這樣的文件或目錄」 顯然,目錄確實存在,所以我可以手動訪問。 –

+0

@Adrià是的,我沒有想過'cd'是這裏的命令。我更新了答案,儘管它現在或多或少地與您自己發佈的答案相匹配(但更多地解釋了它的工作原理)。 –

0

爲NehalĴ邇在他的評論中說,正確的語法如下:

docker exec [id] /bin/bash -c 'cd /var/www/project && composer install' 

非常感謝!

1

容器id後的所有內容都是要運行的命令,所以在第一個示例中,-c不是執行exec的選項,但由於該命令不存在,所以命令docker嘗試運行並失敗。

很可能您從docker run命令中找到了此語法,其中入口點設置爲/bin/sh。但是,exec繞過入口點,因此您需要包含完整的命令才能運行。正如其他人所指出的,命令包括像bash或在下面的例子中,SH A殼:

docker exec [id] /bin/sh -c 'cd /var/www/project && composer install'