我在读Dockerfile引用转义部分。在文档中,有一个示例演示默认转义字符“\”如何在Windows系统中造成麻烦。
FROM microsoft/nanoserver
COPY testfile.txt c:\\
RUN dir c:\
在以下方面的成果:
PS C:\John>码头构建-t cmd。 将生成上下文发送到Docker守护进程3.072 kB 步骤1/2 :来自microsoft/nanoserver -> 22738ff49c6d 步骤2/2 :复制testfile.txt c:\RUN dir c: GetFileAttributesEx c:RUN:系统找不到指定的文件。 PS C:\John>
根据我的理解,COPY testfile.txt c:\\
中的第一个反斜杠将避开第二个反斜杠,命令变成COPY testfile.txt c:\
。反斜杠在RUN dir c:\
命令中消失,因为它作为转义字符工作,这是有意义的。但是,我不知道为什么换行符也要转义,因为复制和运行命令被合并到一个命令中。我不是一个转义角色的专家,我可能误解了一些非常基本的东西。你能告诉我在这个场景中转义角色是如何工作的吗?提前谢谢。
发布于 2022-06-12 02:52:32
好吧,这很痛苦,但我想我现在有了答案。
TL;我认为,除了运行和CMD之外,使用“转义字符”两次将自己转义本身为。码头工人的文件似乎过时了。
充分解释
要从OP发布的文档中运行这个示例,我认为需要切换docker守护进程来运行Windows容器,而不是Linux容器。我认为,对于在不引起此错误的情况下提取Windows映像,这是非常必要的:
ltsc2022: Pulling from windows/nanoserver
no matching manifest for linux/amd64 in the manifest list entries
需要更新Docker文档,FROM windows/nanoserver
会给您带来一个错误。因此,我更改了FROM
指令。下面是我的测试Dockerfile:
# escape=\
FROM mcr.microsoft.com/windows/nanoserver:win10-21h1-preview
COPY testfile.txt c:\\
RUN dir c:
COPY \\subdir\\subfile.txt c:\\newdir\\
RUN dir c:\ /w
RUN dir /w c:\subdir\\
RUN type c:\testfile.txt
这行得通!有几件事要注意:
第二行末尾的第二个\,即我的第一个拷贝指令末尾的
\
将被解释为换行符的转义,而不是从第一个\转义的目标。我觉得这些文件已经过时了。
我想他们终于纠正了这种奇怪的行为。
除行尾处外,不在RUN命令中执行转义。
这对于RUN或CMD指令都是有效的。运行指令可以在两种形式中任一种形式运行。 (3种形式的CMD ),在shell或exec格式中。在shell形式中,它将逐字逐句地读取\
,除非在行尾,它将通过将\
解释为转义字符而给您带来麻烦,这将在下一条指令之前转义任何空白。因此:
RUN dir c:\
# breaks the code, because it will escape white space
# and add the next lines to this instruction. That is:
# RUN dir c:RUN dir...
RUN dir c:\\
# also doesn't work, because then it runs as `cmd /S /C dir c:\\
# which is invalid syntax. It must be `c:\` instead
有趣的是,这2条指令会起作用,但我无法解释为什么第一条是有效的:
RUN dir c:\newdir\\
# works! But why does this work and `RUN dir c:\\` doesn't?
RUN dir c:\ /w
# works because it doesn't end in `c://`
无论如何,在这些情况下最好的做法是以exec形式运行这些指令。当以exec形式出现时,参数被解析为JSON必须始终以"
括起来,并且所有\
都需要转义。
RUN ["cmd", "/C", "dir", "c:\\"]
# works
https://stackoverflow.com/questions/59131131
复制相似问题