2016-02-29 26 views
8

我想將一行文本寫入正在運行的泊塢窗容器中的文本文件。這是我到目前爲止已經試過:Docker exec - 將文本寫入容器中的文件

docker exec -d app_$i eval echo "server.url=$server_url" >> /home/app/.app/app.config 

響應:

/home/user/.app/app.config: No such file or directory 

第二個嘗試:

cfg_add="echo 'server.url=$server_url' >> /home/user/.app/app.config" 
docker exec -i app_$i eval $cfg_add 

響應:

exec: "eval": executable file not found in $PATH 

任何想法?

+0

爲什麼'-d'爲docker exec? – user2915097

+2

'eval'不在容器中。內核在主機和容器之間共享。程序不是。如果你在你的主機上安裝了'nc',只要沒有安裝它,容器就不能執行它。 – Auzias

+0

@Auzias:問題不在於'eval'不是容器中的_present_(它很可能是容器shell的_shell內置函數),但它不是外部實用工具_因此'docker exec'不能調用它。 – mklement0

回答

22

eval是內建殼,而docker exec需要外部工具被調用,因此使用eval一個選項。

相反,調用在所述容器(bash明確殼的可執行文件,並把它傳遞給執行作爲命令,通過其-c選項:

docker exec "app_$i" bash -c "echo 'server.url=$server_url' >> /home/app/.app/app.config" 

通過使用雙 - 引用字符串傳遞到bash -c,您確保當前外殼首先執行字符串插值,而容器的bash實例然後看到擴展結果爲文字,作爲嵌入式單引號字符串的一部分。


至於你的症狀

  • /home/user/.app/app.config: No such file or directory報道,因爲你想要的重定向在主機的外殼實際發生的容器發生- 因爲目錄。 /home/user/.app顯然你的主機的文件系統中不存在,命令失敗從根本上,之前你的主機的shell甚至試圖執行命令(bash將中止命令執行,如果無法執行輸出重定向)。

    • 因此,即使你的第一個命令中還含有eval,它的使用並沒有表面,直到你的第二個命令,這實際上得到執行的問題。
  • exec: "eval": executable file not found in $PATH發生的事情,因爲,如前所述,eval不是外部工具,但shell內建docker exec只能執行外部工具。

+0

很棒的回答。我在下面發佈了一個答案,沒有意識到他想使用主機聲明的變量等。你的答案要好得多,並且解釋得很好。謝謝。 – CtheGood

+0

@CtheGood:謝謝;除了使用主機變量之外,您的命令將不起作用,因爲您必須將參數_separately_傳遞給'docker exec';在您的情況下,_entire_單引號字符串將被解釋爲_command name_,並導致以下錯誤:'exec:「echo \」Hello World \「> test.txt」:可執行文件未在$ PATH中找到 – mklement0

+0

下面是一個示例,您可以在其中使用引號編寫文件。例如,你想寫'obj ['key'] ='value''到一個名爲'/etc/config.py'的文件。 'docker exec「app_ $ i」bash -c'echo「obj ['' 「'key''''] ='''value'''」>/etc/config.py'' – Gourneau

4

此外:

如果你需要從容器外寫文,這也適用:您輸入

(docker exec -i container sh -c "cat > c.sql") < c.sql 

這將管子插入容器。當然,這也適用於純文本(無文件)。離開-t參數非常重要。

https://github.com/docker/docker/pull/9537

UPDATE(如果你只需要複製文件,不能刪除文件的部分):

泊塢v17.03具有docker cp其中本地FS和容器之間拷貝:https://docs.docker.com/engine/reference/commandline/cp/#usage