Dockerfile ~ 添加 Windows 文件夹的正确语法

Dockerfile ~ Correct Syntax for Adding Windows Folders

提问人:Kira Resari 提问时间:9/21/2018 最后编辑:Kira Resari 更新时间:9/24/2018 访问量:10782

问:

我正在尝试创建一个 Dockerfile,将我在本地 Windows 文件系统某处的文件夹添加到 Windows 容器中。但是,我很难弄清楚正确的语法。

具体来说,我正在尝试将目录 [C:\Foo Source Files\Zog Foo\Bar] 的内容复制到 Windows Docker 容器中的 [C:\Bar]。

到目前为止,我已经尝试了以下变体:

ADD ["C:\Foo Source Files\Zog Foo\Bar", "C:/Bar"]
ADD ["C:\Foo Source Files\Zog Foo\Bar\", "C:/Bar/"]

这些导致在尝试运行生成映像时出现以下错误:

failed to process "[\"C:\\Foo": unexpected end of statement while looking for matching double-quote

相比之下,以下变体...

ADD ["C:/Foo Source Files/Zog Foo/Bar", "C:/Bar"] 
ADD ["C:/Foo Source Files/Zog Foo/Bar/", "C:/Bar/"]
ADD ["C:\\Foo Source Files\\Zog Foo\\Bar\\", "C:/Bar/"]
ADD ["C:\\\\Foo Source Files\\\\Zog Foo\\\\Bar\\\\", "C:/Bar/"]
ADD ["C:\\\\Foo Source Files\\\\Zog Foo\\\\Bar", "C:/Bar/"]
ADD C:/Foo Source Files/Zog Foo/Bar/, C:/Bar/
ADD C:\Foo Source Files\Zog Foo\Bar\, C:/Bar/

...导致以下不同的错误:

ADD failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder997952273\Foo Source Files\Zog Foo\Bar: The system cannot find the path specified.

这个变种...

ADD C:\Foo Source Files\Zog Foo\Bar\, C:/Bar/

...导致了这个略有不同的错误:

ADD failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder997952273\Foo: The system cannot find the path specified.

之后,我尝试删除重命名我的源文件夹,使它们不包含任何空格,并尝试使用以下语句:

ADD C:\FooSourceFiles\ZogFoo\Bar\, C:/Bar/

...但这只导致了以下错误:

ADD failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder197358441\C:FooSourceFilesZogFooBar,: The system cannot find the file specified.

我还尝试了额外的斜杠作为逃逸角色......

ADD C:\\FooSourceFiles\\ZogFoo\\Bar\\, C:/Bar/

...但这也失败了,因为显然 Docker 正在 docker 工作目录的子目录中查找文件,即使我试图指示它查看绝对路径

ADD failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder492157702\FooSourceFiles\ZogFoo\Bar\,: The system cannot find the path specified.

对此的任何帮助将不胜感激。

编辑: 解释为什么这不是 Dockerfile COPY 指令失败的重复? 这个问题是关于COPY指令失败的,结果是因为“~/”不起作用,它也与Linux容器有关。我的问题主要是关于在 Windows 容器上使用 ADD 命令的正确语法。我看不出这两个问题有什么关系,关于该主题的批准答案甚至不适用于我的情况。

docker dockerfile windows-container

评论

1赞 Gregory Suvalian 9/21/2018
这里列出了一些关于 Windows 容器的好问题。learn.microsoft.com/en-us/virtualization/windowscontainers/......
0赞 Gregory Suvalian 9/21/2018
此外,我会使用 #escape = ' 启动所有 Windows docker 文件
0赞 David Maze 9/24/2018
Dockerfile COPY 指令的副本可能失败?

答:

7赞 Kira Resari 9/24/2018 #1

显然,问题在于 Docker 不支持绝对路径作为输入路径。

我终于能够通过将“Bar”文件夹与Dockerfile放在同一目录中,然后在Dockerfile中使用以下ADD语句来使其工作:

ADD Bar C:/Bar/

如果我弄错了,并且可以使用绝对路径作为源路径,请纠正我

评论

0赞 tjb 3/1/2019
看来你是对的 [stackoverflow.com/a/39667707/530634]
0赞 TomB 10/16/2019
根据 doco,ADD 的源文件必须位于“上下文”内:“<src> 路径必须在构建的上下文中;你不能添加../something /something,因为 docker 构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程”