首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用docker cp将多个文件从容器复制到主机

如何使用docker cp将多个文件从容器复制到主机
EN

Stack Overflow用户
提问于 2018-07-10 12:19:17
回答 5查看 9.3K关注 0票数 15

我希望使用通配符从容器中的一个目录中选择多个文件,并使用docker将这些文件从容器复制到docker主机。

我无法找到对使用通配符的支持是否可用于docker。

代码语言:javascript
复制
docker cp fd87af99b650:/foo/metrics.csv* /root/metrices_testing/

这将导致错误metrics.csv*: no such file or directory

我遇到了一个示例,其中for loop用于选择几个文件,然后发送到容器,但我希望将文件从一个容器传输到另一个主机,并希望在docker主机本身上完成这一任务,因为脚本只在主机上运行。

首先使用docker选择文件,然后使用docker复制它们,这是一个选项。但这是一个2步的过程。

有人能帮我一步步做这件事吗?

编辑:

我试过这个。一步之遥,但仍然失败。

代码语言:javascript
复制
# for f in $(docker exec -it SPSRS bash -c "ls /opt/tpa/logs/metrics.csv*");
     do docker cp SPSRS:$f /root/metrices_testing/;
 done


: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-08:45
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-09:00
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-09:15
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-09:30
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-09:45
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-10:00
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-10:15
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-10:30
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-10:45
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-11:00
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-11:15
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-11:30
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-11:45
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-12:00
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-12:15
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-12:30
: no such file or directory lstat /docker/overlay2/193d2ad0d8d087377e3b96cbfb672b0e39132ae5e961872127614c9396f8c068/merged/opt/SPS_18_5_R1/logs/metrics.csv.2018.07.10-12:45
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-10 15:36:03

事实上,您的解决方案可以使您的目标稍微改变一下:

代码语言:javascript
复制
for f in $(docker exec -it SPSRS bash -c "ls /opt/tpa/logs/metrics.csv*"); do docker cp SPSRS:$f /root/metrices_testing/; done

->

代码语言:javascript
复制
for f in $(docker exec SPSRS bash -c "ls /opt/tpa/logs/metrics.csv*"); do docker cp SPSRS:`echo $f | sed 's/\r//g'` /root/metrices_testing/; done

这是因为docker exec SPSRS bash -c "ls /opt/tpa/logs/metrics.csv*"将在每个匹配的字符串中都包含\r,因此最终cp无法在容器中找到文件。

因此,我们使用echo $f | sed 's/\r//g'来消除每个文件名的\r,这可能会使您工作。

注:用于高寒,需要用sh代替bash,同时要删除-it,以避免在高寒地区使用彩色印刷品,引入^[[0;0m等不可见字符。

票数 7
EN

Stack Overflow用户

发布于 2020-04-07 17:56:19

Docker cp命令支持复制文件夹中的所有内容。

代码语言:javascript
复制
docker cp -a container-id:/opt/tpa/logs/  /root/testing/

在上面的示例中,将文件从容器文件夹/opt/tpa/log复制到本地计算机/root/testing/文件夹。在这里,/log/中的所有文件都将被复制到本地。这里的诀窍是使用-a选项和docker cp

票数 5
EN

Stack Overflow用户

发布于 2018-07-10 12:31:36

Docker cp仍然不支持通配符。但是,您可以通过以下方式在Dockerfile中使用它们:

代码语言:javascript
复制
COPY hom* /mydir/        # adds all files starting with "hom"
COPY hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

参考资料:https://docs.docker.com/engine/reference/builder/#copy

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51265032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档