從Docker容器復(fù)制文件到主機(jī)的四種方法
技術(shù)背景
在使用Docker進(jìn)行開(kāi)發(fā)和部署時(shí),有時(shí)需要將容器內(nèi)生成的構(gòu)建工件復(fù)制到主機(jī)上。例如,在持續(xù)集成(CI)服務(wù)器上使用Docker構(gòu)建依賴項(xiàng),而不希望在代理服務(wù)器上安裝所有運(yùn)行時(shí)和庫(kù),這就需要將容器內(nèi)構(gòu)建的工件復(fù)制回主機(jī)。
實(shí)現(xiàn)步驟
方法一:使用docker cp命令
這是最直接的方法,可在容器運(yùn)行或停止時(shí)使用。
- 獲取容器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
此方法無(wú)需啟動(dòng)容器。
- 創(chuàng)建容器:使用docker create --name dummy IMAGE_NAME命令創(chuàng)建一個(gè)容器。
- 復(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
方法三:掛載卷
通過(guò)掛載卷的方式,將容器內(nèi)的文件復(fù)制到主機(jī)上。
- 創(chuàng)建目錄:在主機(jī)上創(chuàng)建一個(gè)目錄用于存儲(chǔ)工件。
- 運(yùn)行容器并掛載卷:使用docker run -i -v ${PWD}/artifacts:/artifacts ubuntu:14.04 sh << COMMANDS命令運(yùn)行容器并掛載卷。
- 在容器內(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選項(xiàng)(Docker 19.03及以上版本)
此方法可跳過(guò)創(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選項(xiàng)
DOCKER_BUILDKIT=1 docker build --target artifact --output type=local,dest=. .
最佳實(shí)踐
- 權(quán)限問(wèn)題:在使用掛載卷的方法時(shí),可能會(huì)遇到文件權(quán)限問(wè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,可提高命令的可讀性和可維護(hù)性。
常見(jiàn)問(wèn)題
- 容器未運(yùn)行時(shí)
docker cp是否可用:可以,容器不運(yùn)行時(shí)也可以使用docker cp命令。 - 復(fù)制目錄時(shí)出錯(cuò):如果復(fù)制目錄時(shí)出現(xiàn)權(quán)限問(wèn)題,可以先將目錄復(fù)制到
/tmp/,再?gòu)?code>/tmp/移動(dòng)到目標(biāo)位置。
docker cp 5f2371a7da7c:/home/euler/mfem/miniapps/navier/3dfoc /tmp/ mv /tmp/3dfoc ~/Downloads/
到此這篇關(guān)于從Docker容器復(fù)制文件到主機(jī)的四種方法的文章就介紹到這了,更多相關(guān)Docker復(fù)制文件到主機(jī)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker安裝MySQL并使用Navicat連接的使用示例
在Docker里運(yùn)行MySQL的方式還是很方便的,本文主要介紹了Docker安裝MySQL并使用Navicat連接的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
解決docker run hello-world遇到錯(cuò)誤消息-error during&n
這篇文章主要介紹了解決docker run hello-world遇到錯(cuò)誤消息-error during conne問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
idea整合docker快速部署springboot應(yīng)用的詳細(xì)過(guò)程
這篇文章主要介紹了idea整合docker快速部署springboot應(yīng)用,文中給大家提到關(guān)于安裝docker步驟,idea連接遠(yuǎn)程docker的方法,需要的朋友可以參考下2021-10-10
Docker 搭建集群MongoDB的實(shí)現(xiàn)步驟
這篇文章主要介紹了Docker 搭建集群MongoDB的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Docker容器端口映射后突然無(wú)法連接的排查過(guò)程
這篇文章主要給大家介紹了關(guān)于Docker容器端口映射后突然無(wú)法連接的排查過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Ubuntu系統(tǒng)下docker?Pull鏡像錯(cuò)誤timeout解決辦法
最近在用docker搭個(gè)開(kāi)發(fā)環(huán)境,發(fā)現(xiàn)在拉取鏡像的時(shí)候有點(diǎn)問(wèn)題,這篇文章主要給大家介紹了關(guān)于Ubuntu系統(tǒng)下docker?Pull鏡像錯(cuò)誤timeout的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
容器化技術(shù)架構(gòu)jenkins?docker?k8s腳本淺析
本篇博文不是詳細(xì)介紹容器技術(shù)的,而是具體的實(shí)踐。此篇博文分為兩個(gè)階段,分別是ci,cd。包含三部分內(nèi)容,分別是jenkins,docker,k8s的腳本淺析2022-03-03
Docker搭建PHP運(yùn)行環(huán)境完整步驟(圖文教程)
PHP是一種廣泛使用的編程語(yǔ)言,被用于Web開(kāi)發(fā)和服務(wù)器管理等各種用途,而Docker則是一種非常流行的容器化平臺(tái),可以方便地管理應(yīng)用程序和環(huán)境,這篇文章主要給大家介紹了關(guān)于Docker搭建PHP運(yùn)行環(huán)境的完整步驟,需要的朋友可以參考下2023-09-09

