如何在Dockerfile中实现容器间文件复制?现有COPY指令执行失败
Docker容器间文件复制的正确方式
首先明确:Dockerfile里的COPY指令无法直接跨运行中的容器复制文件——它的作用范围仅限构建上下文(本地文件/目录)或多阶段构建的前序构建阶段,根本不支持直接访问另一个容器的文件系统,你写的containersource:/mypath/filename.properties这种格式完全不符合COPY的语法规范,所以必然执行失败。
要实现容器A到容器B的文件复制,推荐两种常用方案:
方案1:用docker cp命令(运行时操作)
如果是在容器运行后完成复制,直接用Docker命令行工具操作:
- 先把容器A的文件复制到本地临时位置:
docker cp containersource:/mypath/filename.properties ./temp-file.properties - 再将本地文件复制到容器B:
docker cp ./temp-file.properties containerdest:/path/cfg/
也可以跳过本地临时文件,一步完成:
docker exec containersource cat /mypath/filename.properties | docker exec -i containerdest sh -c 'cat > /path/cfg/filename.properties'
方案2:通过共享存储卷(支持构建/运行时共享)
如果需要长期共享文件,或者在构建镜像阶段就需要文件同步,建议用Docker卷:
- 创建一个共享卷:
docker volume create shared-data - 启动容器A时挂载该卷,再把目标文件复制到卷内路径:
docker run -d --name containersource -v shared-data:/shared-volume your-image-a docker exec containersource cp /mypath/filename.properties /shared-volume/ - 启动容器B时挂载同一个卷到指定路径:
docker run -d --name containerdest -v shared-data:/path/cfg your-image-b
此时容器B的/path/cfg目录下就能直接访问到目标文件。
补充:多阶段构建场景(仅镜像构建时)
如果你的需求是构建容器B的镜像时,从容器A的镜像(而非运行中的容器)复制文件,可以用多阶段构建:
# 第一阶段:基于容器A的镜像创建临时构建阶段 FROM your-image-a as stage-a # 第二阶段:构建容器B的镜像 FROM your-image-b # 从临时阶段复制文件到当前镜像 COPY --from=stage-a /mypath/filename.properties /path/cfg/
注意这里是从镜像(构建阶段)复制,不是从运行中的容器。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

