2016-08-30 53 views
1

我正在嘗試更改碼頭集裝箱內的配置文件。對碼頭集裝箱執行sed命令

docker exec container_name sed -ire '/URL_BASE = /c\api.myapiurl' tmp/config.ini 

本地執行此sed命令工作得很好,但是當我嘗試在容器中執行此操作時,我收到以下錯誤消息。

sed: cannot rename tmp/config.ini: Operation not permitted 

我需要做的是從「的config.ini」更換「URL_BASE =」之前部署容器到我的服務器。

我不知道爲什麼sed命令試圖重命名文件,當它不假設。

任何想法?

我已經試過

我試圖與--privileged標誌來執行,但沒有奏效。我試圖用chmod來改變文件的權限,但我不能以同樣的權限爲由。

docker exec --privileged container_name sed -ire '/URL_BASE = /c\api.myapiurl' tmp/config.ini 

Result: sed: cannot rename tmp/config.ini: Operation not permitted 

CHMOD

docker exec --privileged container_name chmod 755 tmp/config.ini 

Result: chmod: changing permissions of 'tmp/config.ini': Operation not permitted 

我也試過泊塢窗之前使用sudo執行,但也不能工作。

+0

這是正確的命令來取代你的字符串?您可以在手動執行時驗證它:'docker run -it bash'然後執行sed <...>' – n2o

+0

sed inplace通過創建文件的副本然後將其替換爲原始文件來工作。你的問題是,你使用管理員權限在容器內創建了文件,但是在後面的部分轉移到另一個用戶。所以,無論何時你試圖執行exec,你都以非管理員用戶的身份輸入這些命令。告訴我們你的Dockerfile。你可以通過鍵入以下命令來驗證它:'docker exec container_name whoami'和'docker exec container_name ls -l tmp/config.ini' –

回答

1

Nehal是絕對正確的,sed可以創建一個本地文件,所以您只需要一種不同的方法,它通常在Linux上使用:heredocs

從文檔的第一行開始,這裏的文檔是一個特殊用途的代碼塊。它使用一種I/O重定向的形式將命令列表提供給交互式程序。

它可以幫助我們碼頭工人的exec如下:

docker exec -i container_name bash <<EOF 
sed -ire '/URL_BASE = /c\api.myapiurl' /tmp/config.ini 
grep URL_BASE /tmp/config.ini 
# any other command you like 
EOF 

注意了-t,這是常用運行bash的,因爲它分配一個僞TTY,我們真的不需要。 此外,爲了安全,請始終使用絕對路徑,如/tmp/config.ini