使用 xargs 将文件从本地系统复制到 docker 容器
Using xargs to copy files from local system into docker container
我有一个包含大约 8000 张图像的文件夹,名称如下 img_991_990_0_drawing.jpg.jpg
。我想将本地系统中的所有文件复制到 docker 容器中。
OS:Ubuntu 18.04.2 LTS
Docker: 18.09.2
我尝试将 sudo docker cp <source_path> <container_id>:<dest_path>
和 运行 转换为 sudo: unable to execute /usr/bin/docker: Argument list too long
。
所以我尝试用xargs
复制所有文件 find /data/projects/cad-detection/darknet/result_img/* | xargs /bin/cp 1f17d5044287:/home/dataturks/bazaar/uploads/2c91808274774ae60/
但我会收到“不是目录”错误
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_2585_2581_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_4076_4070_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_5570_5560_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_7052_7040_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_999_998_0_drawing.jpg.jpg' is not a directory
我通常可以使用cp
来复制我的文件,所以我以前从未使用过xargs
。我想我缺少一个选项。
如果您想知道为什么我要复制一堆图像而不是一个文件夹,我正在使用 DataTurks,我需要 /bazaar/uploads/2c91808274774ae60
中的文件才能通过本地主机访问它们。
我想你正在寻找:
find /data/projects/cad-detection/darknet/result_img/ -type f -print0 |
xargs -0 -iIMG docker cp IMG 1f17d5044287:/home/dataturks/bazaar/uploads/2c91808274774ae60/
首先,您在示例中使用的是 /bin/cp
,而不是 docker cp
。
其次,当您有一个看起来像 xargs <cmd> <arg1>
的 xargs
命令时,这将生成 <cmd> <arg1> arg arg arg ...
形式的命令。要获得 docker cp
的正确语法,您需要使用 -i
选项定义替换字符串,然后将其插入命令中的适当位置(因为目标目录需要是最后一个参数)。
find 的 -print0
和 xargs
的 -0
只是为了正确性而存在;如果您的文件名包含空格,它们将允许一切正常工作。
作为替代方案,考虑只使用 tar
代替:
tar -C /data/projects/cad-detection/darknet/result_img/ -cf- . |
docker exec -i 1f17d5044287 tar -C /home/dataturks/bazaar/uploads/2c91808274774ae60/ -xf-
当然,这需要在您的容器中安装tar
。
我有一个包含大约 8000 张图像的文件夹,名称如下 img_991_990_0_drawing.jpg.jpg
。我想将本地系统中的所有文件复制到 docker 容器中。
OS:Ubuntu 18.04.2 LTS
Docker: 18.09.2
我尝试将 sudo docker cp <source_path> <container_id>:<dest_path>
和 运行 转换为 sudo: unable to execute /usr/bin/docker: Argument list too long
。
所以我尝试用xargs
复制所有文件 find /data/projects/cad-detection/darknet/result_img/* | xargs /bin/cp 1f17d5044287:/home/dataturks/bazaar/uploads/2c91808274774ae60/
但我会收到“不是目录”错误
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_2585_2581_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_4076_4070_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_5570_5560_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_7052_7040_0_drawing.jpg.jpg' is not a directory
/bin/cp: target '/data/projects/cad-detection/darknet/result_img/img_999_998_0_drawing.jpg.jpg' is not a directory
我通常可以使用cp
来复制我的文件,所以我以前从未使用过xargs
。我想我缺少一个选项。
如果您想知道为什么我要复制一堆图像而不是一个文件夹,我正在使用 DataTurks,我需要 /bazaar/uploads/2c91808274774ae60
中的文件才能通过本地主机访问它们。
我想你正在寻找:
find /data/projects/cad-detection/darknet/result_img/ -type f -print0 |
xargs -0 -iIMG docker cp IMG 1f17d5044287:/home/dataturks/bazaar/uploads/2c91808274774ae60/
首先,您在示例中使用的是 /bin/cp
,而不是 docker cp
。
其次,当您有一个看起来像 xargs <cmd> <arg1>
的 xargs
命令时,这将生成 <cmd> <arg1> arg arg arg ...
形式的命令。要获得 docker cp
的正确语法,您需要使用 -i
选项定义替换字符串,然后将其插入命令中的适当位置(因为目标目录需要是最后一个参数)。
find 的 -print0
和 xargs
的 -0
只是为了正确性而存在;如果您的文件名包含空格,它们将允许一切正常工作。
作为替代方案,考虑只使用 tar
代替:
tar -C /data/projects/cad-detection/darknet/result_img/ -cf- . |
docker exec -i 1f17d5044287 tar -C /home/dataturks/bazaar/uploads/2c91808274774ae60/ -xf-
当然,这需要在您的容器中安装tar
。