首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >转义字符如何在Dockerfile中工作?

转义字符如何在Dockerfile中工作?
EN

Stack Overflow用户
提问于 2019-12-01 23:59:49
回答 2查看 9.3K关注 0票数 8

我在读Dockerfile引用转义部分。在文档中,有一个示例演示默认转义字符“\”如何在Windows系统中造成麻烦。

代码语言:javascript
运行
复制
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:\命令中消失,因为它作为转义字符工作,这是有意义的。但是,我不知道为什么换行符也要转义,因为复制和运行命令被合并到一个命令中。我不是一个转义角色的专家,我可能误解了一些非常基本的东西。你能告诉我在这个场景中转义角色是如何工作的吗?提前谢谢。

EN

Stack Overflow用户

发布于 2022-06-12 02:52:32

好吧,这很痛苦,但我想我现在有了答案。

TL;我认为,除了运行和CMD之外,使用“转义字符”两次将自己转义本身为。码头工人的文件似乎过时了。

充分解释

要从OP发布的文档中运行这个示例,我认为需要切换docker守护进程来运行Windows容器,而不是Linux容器。我认为,对于在不引起此错误的情况下提取Windows映像,这是非常必要的:

代码语言:javascript
运行
复制
ltsc2022: Pulling from windows/nanoserver
no matching manifest for linux/amd64 in the manifest list entries

需要更新Docker文档,FROM windows/nanoserver会给您带来一个错误。因此,我更改了FROM指令。下面是我的测试Dockerfile:

代码语言:javascript
运行
复制
# 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  

这行得通!有几件事要注意:

  1. I无法复制 文档错误,其中:

第二行末尾的第二个\,即我的第一个拷贝指令末尾的\将被解释为换行符的转义,而不是从第一个\转义的目标。我觉得这些文件已经过时了。

我想他们终于纠正了这种奇怪的行为。

  1. 文件上说:

除行尾处外,不在RUN命令中执行转义。

这对于RUN或CMD指令都是有效的。运行指令可以在两种形式中任一种形式运行。 (3种形式的CMD ),在shell或exec格式中。在shell形式中,它将逐字逐句地读取\,除非在行尾,它将通过将\解释为转义字符而给您带来麻烦,这将在下一条指令之前转义任何空白。因此:

代码语言:javascript
运行
复制
   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条指令会起作用,但我无法解释为什么第一条是有效的:

代码语言:javascript
运行
复制
   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必须始终以"括起来,并且所有\都需要转义。

代码语言:javascript
运行
复制
   RUN ["cmd", "/C", "dir", "c:\\"]
   # works
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59131131

复制
相关文章

相似问题

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