Dockerfile:COPY / ADD路径中带有空格字符(Windows)

时间:2019-06-03 02:09:37

标签: windows docker path dockerfile

在Windows 10(cmd)中,我试图从子文件夹中复制文件,该子文件夹的名称中包含空格字符。

  1. 首先,我尝试使用引号:

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

    错误消息:

      

    无法处理“ \”文件夹“ :查找匹配的双引号时语句意外结束

  2. “ JSON”格式(跳过第一行):

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

    错误消息:

      

    无法处理“ [\”文件夹“ :查找匹配的双引号时语句意外结束

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

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

    错误消息:

      

    无法处理“ \”文件夹\\“ :查找匹配的双引号时语句意外结束

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

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

    错误消息:

      

    无法处理“ \”文件夹\\\\“ :查找匹配的双引号时语句意外结束

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

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

    错误消息:

      

    复制失败:没有源文件

  6. 转义符替换:

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

    错误消息:

      

    无法处理“ \”文件夹`“ :查找匹配的双引号时语句意外结束

  7. 相同,但没有引号:

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

    错误消息:

      

    复制失败:stat / var / lib / docker / tmp / docker-builder082039614 / 文件夹:没有此类文件或目录

  8. 使用 tar 归档文件打包/解压缩的方法(我对该想法不满意)。

应该有可能,不是吗?

2 个答案:

答案 0 :(得分:1)

也许您可以使用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/"]

更新您的评论:

official guide中,它说:

  

复制包含特殊字符(例如[和])的文件或目录时,需要遵循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]/"]

答案 1 :(得分:1)

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

tar/zip 文件,然后轻松“docker cp”它们,而不必担心数十个 []'"..

容器机器中的 tar 文件:

压缩

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

或 解压

tar -cvf myfiles.tar file1.txt dir24 file_xyz

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

在windows下打开cmd 运行

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

检查文件是否已传输到 d:/TARGETDIR/