Dockerfile:在路径中包含空格(Windows)的COPY / ADD

36
在 Windows 10 的命令提示符中,我想要复制一个子文件夹中名称包含空格字符的文件。
  1. 首先我尝试使用引号:

    FROM jfloff/alpine-python:2.7
    COPY "Folder 1/File.txt" "Dir 1"
    

    错误信息:

    处理"\"Folder"时失败:在查找匹配的双引号时出现意外的语句结尾

  2. "JSON"格式(跳过了第一行):

    COPY ["Folder 1/File.txt" "Dir 1"]
    

    错误信息:

    无法处理"[\"Folder":查找匹配的双引号时出现意外的语句结尾

  3. 尝试使用单个反斜杠进行转义:

    COPY "Folder\ 1/File.txt" "Dir\ 1"
    

    错误信息:

    处理"\"Folder\\"时失败:寻找匹配的双引号期间出现意外的语句结尾

  4. 试图用双反斜杠进行转义:

    COPY "Folder\\ 1/File.txt" "Dir\\ 1"
    

    错误信息:

    处理"\"Folder\\\\"时失败:在寻找相匹配的双引号时遇到意外的语句结束

  5. 还尝试了使用%20代替空格的建议:

    COPY ["Folder%201/File.txt" "Dir%201"]
    

    错误信息:

    COPY失败:无源文件

  6. 转义字符替换:

    # escape=`
    COPY "Folder` 1/File.txt" "Dir 1"
    

    错误信息:

    在查找匹配的双引号时未能处理"\"Folder`":语句意外结束

  7. 去掉引号后的错误信息:

    无法处理"\"Folder`":在寻找匹配的双引号时出现语句意外结束

  8. #escape=`
    COPY Folder` 1/File.txt Dir` 1
    

    错误信息:

    COPY 失败:stat /var/lib/docker/tmp/docker-builder082039614/文件夹:没有那个文件或目录

  9. 使用 tar 存档打包/解包的方法(我不满意这个想法)。

这应该是可能的,不是吗?


这个答案能帮到你吗?需要使用绝对路径吗? - menya
@menya 很遗憾,它没有帮助到你。 - ellockie
3个回答

45

也许你可以使用ARG来帮助你,就像这样:

Dockerfile:

FROM jfloff/alpine-python:2.7
ARG src="Folder 1/File.txt"
ARG target="Dir 1/"
COPY ${src} ${target}

顺便提一句,如果你真的想把 Dir 1 当做一个文件夹看待,那么最后必须添加一个/

此外,JSON格式也可以使用,只是你错过了一个,,应该是这样的:

FROM jfloff/alpine-python:2.7
COPY ["Folder 1/File.txt", "Dir 1/"]

针对您的评论更新:

官方指南中提到:

当复制包含特殊字符(例如 [ 和 ])的文件或目录时,您需要遵循 Golang 规则对这些路径进行转义,以防止它们被视为匹配模式。

因此,对于您的情况,应该是:

FROM jfloff/alpine-python:2.7
ARG src="[[]Folder 1]/__SLIM_TEMPLATE.mm"
ARG target="[Folder 1]/"
COPY ${src} ${target}

或者:

FROM jfloff/alpine-python:2.7
COPY ["[[]Folder 1]/__SLIM_TEMPLATE.mm", "[Folder 1]/"]

非常感谢!似乎我遇到的问题是路径不仅包含空格,而且还有方括号和下划线:ARG src="[Folder 1]/__SLIM_TEMPLATE.mm" ARG target="[Folder 1]/" COPY ${src} ${target} ,它失败并显示消息:COPY failed: no source files were specified。我尝试转义括号,但没有成功。 - ellockie

6
解决方案如下: enter image description here Docker已更新其COPY命令。因此,您可以使用括号并且文件名可以包含空格。在此处阅读更多信息(官方文档)。

2

同意,从docker获取带有特殊字符的文件确实很烦人,我曾经有过类似的经历,经过数小时的尝试和错误,我想出了这个简单的解决方案,从那时起我一直在使用。

将文件打包成tar/zip格式,然后轻松地使用"docker cp"命令复制它们,而不必担心[]'"等字符的问题。

在您的容器机中打包tar文件:

#zipped
tar czf myfiles.tar.gz file1.txt dir24 file_xyz

#or unzipped
tar -cvf myfiles.tar file1.txt dir24 file_xyz

然后将它们复制到您的Windows计算机中的本地目录。

在Windows中打开命令提示符

运行

# docker cp ABCD_CONTAINER_NAME:PATH/myfiles.tar.gz d:/TARGETDIR/

检查文件是否已经传输到D:/TARGETDIR/目录下


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接