如何将Docker容器内文件复制到Docker卷?COPY命令可行吗?
问题解答
首先明确:Dockerfile里的COPY命令无法实现从容器内部复制文件到卷。原因是Dockerfile负责构建镜像,而卷是容器运行时才会创建/挂载的资源,构建阶段根本不存在卷,COPY命令只能在「主机构建上下文」「镜像的不同构建阶段」之间复制文件,不能直接操作运行时的卷。
针对你的需求,提供两种可行方案:
方案一:Dockerfile+启动脚本(运行时复制到卷)
先在构建阶段把生成的dist目录放到镜像的固定位置,然后通过容器启动脚本,在容器启动时将文件复制到挂载的卷中。
修改你的Dockerfile:
# build docker. FROM node:19 AS PACKER WORKDIR /home/canvas COPY . . RUN yarn install --frozen-lockfile RUN yarn build-only # 先把dist复制到镜像内的一个固定目录,方便后续启动脚本调用 RUN mkdir -p /app/dist RUN cp -r /home/canvas/dist/* /app/dist/ # 添加启动脚本 COPY start.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/start.sh ENTRYPOINT ["start.sh"]
创建start.sh脚本(和Dockerfile同目录):
#!/bin/sh # 假设卷挂载到/volume/canvas,把镜像内的dist文件复制到卷里 if [ -d "/volume/canvas" ]; then cp -r /app/dist/* /volume/canvas/ fi # 执行容器原本的启动命令(如果有,比如你的服务启动命令) exec "$@"
使用时,启动容器时挂载卷:
docker run -v my_canvas_volume:/volume/canvas your_image_name
方案二:docker-compose临时容器复制
如果不需要每次启动容器都复制,只需要一次性把构建好的dist文件同步到卷里,可以用docker-compose创建一个临时服务完成复制:
编写docker-compose.yml:
version: '3.8' services: sync-dist-to-volume: build: . volumes: - canvas_static:/target # 直接执行容器内的复制命令,完成后容器自动退出 command: cp -r /home/canvas/dist/* /target/ volumes: canvas_static:
运行命令完成复制:
docker-compose run --rm sync-dist-to-volume
执行完后,canvas_static卷里就会有容器内生成的dist文件了。
另外,纠正你原Dockerfile里的错误:最后一行的COPY /home/canvas/dist static_web/canvas会从主机的/home/canvas/dist目录复制文件,这不是你想要的。如果只是在镜像内部复制文件,应该用RUN cp命令,而不是COPY。
内容的提问来源于stack exchange,提问作者AnandShiva
相关产品推荐
相关产品推荐

