從Docker容器復(fù)制文件到主機的四種方法
技術(shù)背景
在使用Docker進行開發(fā)和部署時,有時需要將容器內(nèi)生成的構(gòu)建工件復(fù)制到主機上。例如,在持續(xù)集成(CI)服務(wù)器上使用Docker構(gòu)建依賴項,而不希望在代理服務(wù)器上安裝所有運行時和庫,這就需要將容器內(nèi)構(gòu)建的工件復(fù)制回主機。
實現(xiàn)步驟
方法一:使用docker cp命令
這是最直接的方法,可在容器運行或停止時使用。
- 獲取容器ID或名稱:使用
docker ps -a命令查看所有容器,獲取目標(biāo)容器的ID或名稱。 - 復(fù)制文件:使用
docker cp <containerId>:/file/path/within/container /host/path/target命令復(fù)制文件。
# 示例:復(fù)制容器內(nèi)的out_read.jpg文件到當(dāng)前目錄 sudo docker cp goofy_roentgen:/out_read.jpg .
方法二:使用docker create
此方法無需啟動容器。
- 創(chuàng)建容器:使用docker create --name dummy IMAGE_NAME命令創(chuàng)建一個容器。
- 復(fù)制文件:使用docker cp dummy:/path/to/file /dest/to/file命令復(fù)制文件。
- 刪除容器:使用docker rm -f dummy命令刪除容器。
docker create --name dummy ubuntu docker cp dummy:/etc/hosts ./hosts docker rm -f dummy
方法三:掛載卷
通過掛載卷的方式,將容器內(nèi)的文件復(fù)制到主機上。
- 創(chuàng)建目錄:在主機上創(chuàng)建一個目錄用于存儲工件。
- 運行容器并掛載卷:使用docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS命令運行容器并掛載卷。
- 在容器內(nèi)復(fù)制文件:在容器內(nèi)將工件復(fù)制到掛載的卷中。
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# 構(gòu)建軟件
cp <artifact> /artifacts
COMMANDS
方法四:使用BuildKit的--output選項(Docker 19.03及以上版本)
此方法可跳過創(chuàng)建容器和構(gòu)建鏡像的步驟。
- 構(gòu)建:使用
DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .命令構(gòu)建并將結(jié)果輸出到本地目錄。
DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
核心代碼
使用docker cp
docker cp <containerId>:/file/path/within/container /host/path/target
使用docker create
docker create --name dummy IMAGE_NAME docker cp dummy:/path/to/file /dest/to/file docker rm -f dummy
掛載卷
mkdir artifacts
docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS
# 構(gòu)建軟件
cp <artifact> /artifacts
COMMANDS
使用BuildKit的--output選項
DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
最佳實踐
- 權(quán)限問題:在使用掛載卷的方法時,可能會遇到文件權(quán)限問題??梢允褂?code>chown命令調(diào)整文件的所有者和組。
docker run -i -v ${PWD}:/working_dir -w /working_dir -u $(id -u) \
ubuntu:14.04 sh << COMMANDS
chown -R $(id -u):$(id -g) /working_dir/artifacts
COMMANDS
- 使用容器名稱:使用容器名稱而不是ID,可提高命令的可讀性和可維護性。
常見問題
- 容器未運行時
docker cp是否可用:可以,容器不運行時也可以使用docker cp命令。 - 復(fù)制目錄時出錯:如果復(fù)制目錄時出現(xiàn)權(quán)限問題,可以先將目錄復(fù)制到
/tmp/,再從/tmp/移動到目標(biāo)位置。
docker cp 5f2371a7da7c:/home/euler/mfem/miniapps/navier/3dfoc /tmp/ mv /tmp/3dfoc ~/Downloads/
到此這篇關(guān)于從Docker容器復(fù)制文件到主機的四種方法的文章就介紹到這了,更多相關(guān)Docker復(fù)制文件到主機內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker安裝tomcat并部署Springboot項目war包的方法
這篇文章主要介紹了docker安裝tomcat并部署Springboot項目war包的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11
docker-compose部署Java應(yīng)用和相關(guān)依賴方式
介紹如何使用docker-compose一鍵部署Java應(yīng)用及依賴,并實現(xiàn)MySQL數(shù)據(jù)庫的自動初始化2024-10-10

