如何用 docker compose cp 在本地文件系统与服务容器之间复制文件?

如何用 docker compose cp 在本地文件系统与服务容器之间复制文件? 如何用 docker compose cp 在本地文件系统与服务容器之间复制文件【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose当你用 Docker Compose 运行多容器应用后经常需要在宿主机本地文件系统和服务容器之间传递文件把配置、脚本塞进容器或者把容器里生成的日志、结果文件取出来。docker compose cp就是为这件事设计的命令它支持文件和目录的双向复制并且以“服务名”而不是容器 ID 作为定位方式。本文以仓库中端到端测试工程使用的 Compose 项目为例演示完整的操作与验证路径。准备条件已安装 Docker Compose CLIWindows 和 macOS 上它随 Docker Desktop 提供Linux 上需要从本仓库的 release 页面下载二进制文件重命名为docker-compose后放入$HOME/.docker/cli-plugins或系统级插件目录见 README 的 “Where to get Docker Compose” 一节。一个已经docker compose up启动、且目标服务有运行中容器的项目。cp依赖运行中的容器服务没有容器时会直接报错no container found for service ...。下面示例使用仓库测试工程的 Compose 定义 pkg/e2e/testdata/TestCopy/compose.yaml它启动一个长期存活的容器便于随时拷入拷出文件services: nginx: image: alpine init: true command: sleep infinity本地准备好一个源文件cp-me.txt文档示例中内容为hello world以及一个目录cp-folder内含cp-me.txt文档示例内容为hello world from folder。命令语法与路径规则cp命令的两种用法来自 cmd/compose/cp.go 的命令定义docker compose cp [OPTIONS] SERVICE:SRC_PATH DEST_PATH|- docker compose cp [OPTIONS] SRC_PATH|- SERVICE:DEST_PATH带SERVICE:前缀的参数指向容器内路径不带前缀的本地路径自动对应本地文件系统参数支持绝对本地路径如/tmp/data相对路径若以./开头即使包含:也按本地路径处理例如./file:name.txt不会误判为服务名用-代替本地路径表示标准输入/输出详见后文“用标准输入输出替代文件”。可选参数来自 docs/reference/compose_cp.md参数说明--all把run命令创建的一次性容器也纳入目标-a,--archiveArchive 模式复制所有 uid/gid 信息--dry-run以 dry run 模式执行命令-L,--follow-linkSRC_PATH 为符号链接时始终跟随链接--index服务有多个副本时指定容器序号默认0不指定副本把本地文件复制到容器在服务容器已启动的前提下执行docker compose cp ./cp-me.txt nginx:/tmp/default.txt这会读取本地相对路径或任意本地路径下的cp-me.txt写入服务nginx容器的/tmp/default.txt。容器内目标不存在时只要其父目录存在即可成功容器内目标可以是目录也可以是普通文件其他类型会导致destination ... must be a directory or a regular file错误。用docker exec验证文件确实进入容器project替换为你项目名多副本时容器名为project-nginx-1等docker exec project-nginx-1 cat /tmp/default.txt文档示例输出为hello world这是测试文件的内容用于确认拷贝成功。把容器中的文件复制到本地方向反过来SERVICE:SRC_PATH作为第一个参数docker compose cp nginx:/tmp/default.txt ./from-default.txt执行后本地工作目录会出现from-default.txt可用任意方式查看其内容确认例如cat ./from-default.txt文档示例中该文件内容为hello world。目录同样支持双向复制命令形式与文件一致只是路径指向目录# 本地目录 - 容器 docker compose cp ./cp-folder nginx:/tmp # 容器目录 - 本地 docker compose cp nginx:/tmp/cp-folder ./cp-folder2仓库测试用docker exec project-nginx-1 cat /tmp/cp-folder/cp-me.txt验证目录进入容器后内容可读用检查本地./cp-folder2/cp-me.txt的内容验证目录拷出成功文档示例内容均为hello world from folder。多副本服务默认行为与 --index测试用例 pkg/e2e/cp_test.go 用 5 个副本演示了副本相关的规则如果你的服务设置了多副本如docker compose up -d --scale nginx5需要注意本地复制到服务默认写到所有副本。验证方式是对任意副本分别执行docker exec检查例如docker exec project-nginx-3 cat /tmp/default.txt应能看到文件。服务复制到本地默认只从第 1 个副本读取。用--index指定单个副本序号从 1 开始如--index3对应nginx-3# 只写入第 3 个副本 docker compose cp --index3 ./cp-me.txt nginx:/tmp/indexed.txt # 从第 3 个副本读取 docker compose cp --index3 nginx:/tmp/indexed.txt ./from-indexed.txt测试中对未指定的副本执行docker exec project-nginx-2 cat /tmp/indexed.txt预期以退出码 1 失败说明--index只影响所选副本其余副本不会收到文件。用标准输入输出替代文件路径参数中的-表示标准流容器到终端docker compose cp nginx:/tmp/default.txt -内容会输出到 stdout标准输入到容器docker compose cp - nginx:/tmp/从 stdin 读取并写入容器内的目录此时容器内目标必须是目录否则报错destination ... must be a directory。限制与注意事项不支持服务之间直接复制源和目标同时写成SERVICE:PATH形式时命令会报copying between services is not supported。需要中转的话先从服务拷到本地再从本地拷到另一个服务。--all的作用范围默认cp的目标不含run命令创建的一次性容器服务以run方式运行了一次性容器时加--all才会把这些容器纳入目标参考 docs/reference/compose_cp.md 的选项说明。-L, --follow-link容器内 SRC_PATH 是符号链接时默认复制链接本身加-L会跟随链接复制实际内容见 pkg/compose/cp.go 中copyFromContainer的处理逻辑。--dry-run以 dry run 模式执行用于在不实际执行的情况下查看命令行为。完整命令选项以 docs/reference/compose_cp.md 为准cp在命令总览中的位置见 docs/reference/compose.md。如果你的场景是“从服务取文件到本地”之外的方向例如容器之间搬运文件当前文档不支持直接跨服务复制需要走本地中转。【免费下载链接】composeDefine and run multi-container applications with Docker项目地址: https://gitcode.com/GitHub_Trending/compose/compose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考