雖然用bash的方式可以進到container內修改裡面的檔案
但修改過後的檔案只是暫時性的
若將container重開修改的檔案就又會都不見了
而雖然有mount volume的方式
但那卻也只能讓host端的檔案被container端看到和使用
卻無法複製container端的檔案到host來進行修改
這時只能用cp這個指令來完成

 

指令形式:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH

 

(1) 將container的檔案複製至host:

我的container名稱叫做myDetectron

我要將container中/detectron這整個資料夾複製到host端的 /home/kitty/working_dir/myDetectron/

指令如下:

sudo docker cp myDetectron:/detectron /home/kitty/working_dir/myDetectron/

複製完後就可以看到我在host端的myDetectron資料夾下出現了detectron這個資料夾

接著我就可以在host端修改detectron中的檔案
(當然可能會遇到權限不足的問題,我是都直接加sudo來解決)

改完後要把檔案再複製回container內

 

(2)將host端的檔案複製至container:

指令如下:

sudo docker cp /home/kitty/working_dir/myDetectron/. myDetectron:/

上面指令的意思是 把host端/home/kitty/working_dir/myDetectron/底下的所有檔案都複製到container的根目錄底下

因為myDetectron下目前有的檔案也就只有detectron這個資料夾而已
所以上面的指令等同 sudo docker cp /home/kitty/working_dir/myDetectron/detectron myDetectron:/
這時可能有個疑問:為什麼是複製回根目錄而不是剛剛的/detectron呢
這是因為如果指令變成sudo docker cp /home/kitty/working_dir/myDetectron/. myDetectron:/detectron
就會變成要將host端的myDetectron底下的detectron資料夾複製到container端的/detectron底下
當我們要在container中要找剛剛被我們複製來的檔案時
路徑名稱就會變成了/detectron/detectron

這樣多了一層detectron並不是我們想要的
所以我們應該是把host端的detectron資料夾複製到container端的根目錄底下
如此一來複製到container的檔案路徑才會是/detectron
再舉個例子
其實上面的指令也等於
sudo docker cp /home/kitty/working_dir/myDetectron/detectron/. myDetectron:/detectron
這個指令的意思就是將host端的detectron資料夾下的所有東西複製到container的detectron資料夾下

做個小總結:

source端如果是長成dir1/dir2/.的形式(就是/.結尾的話)
就代表要把dir2下的所有東西複製到destination端所指定的資料夾
而如果source端長成dir1/dir2的形式(就是沒有/.結尾的話)
就代表要把dir2這個資料夾(包含dir2本身)複製到destination端所指定的資料夾

 

雖然要複製來複製去的好像有點麻煩
但至少就可以修改container底下的檔案同時本機端也會保留一份
就不怕container關掉重開就什麼都沒了

 

 

 

reference:

1. Named volumes do not copy existing data from image path to volume.

https://github.com/moby/moby/issues/18670

2. docker cp reference

https://docs.docker.com/engine/reference/commandline/cp/#extended-description

文章標籤
全站熱搜
創作者介紹
創作者 慈 的頭像

Debby's blog

發表在 痞客邦 留言(0) 人氣(5,616)