问题
我正在运行.NET Framework SDK来运行GitHub操作来构建项目的发行版。我需要能够将构建的项目文件从Docker Container复制到主机,然后再复制到外部服务器。
在非Docker Runner上,我能够在PowerShell中使用以下命令复制文件:Copy-Item -Path "./ReleaseFolder*" -Destination "\\SERVERNAME\Destination" -Recurse -Force -PassThru
但是,从Docker内部运行时,我收到以下错误:
Copy-Item : Access is denied
At C:\actions-runner\_work\_temp\58a0d5f5-1c21-468a-9cc1-6add157ef7da.ps1:2 char:1
+ Copy-Item -Path "./ReleaseFolder*" -Destination "\\SERVERNAME\Destination"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Copy-Item], UnauthorizedAccessException
+ FullyQualifiedErrorId : System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.CopyItemCommand
Error: Process completed with exit code 1.
我尝试了什么
我试着关闭防火墙,看看这是否是问题所在,但没有成功。
我还尝试使用主机的IP地址(我可以ping到它)Copy-Item -Path "./ReleaseFolder*" -Destination "\\192.168.0.1\Destination" -Recurse -Force -PassThru
,但我收到了相同的错误消息。
通过谷歌搜索,我找到了host.docker.internal
,但我甚至无法ping通它。
我知道将卷作为潜在解决方案的概念,如this question中所讨论的。但是,因为我需要从主机复制到外部服务器,所以这并不能解决我的问题。
如何允许Docker Container访问将文件复制到其主机或更远的地方?或者我应该用另一种方式来做这件事?
1条答案
按热度按时间vcirk6k61#
在容器内构建时,标准方法是:
1.在主机上创建文件所在的目录,如
output/
1.将
output/
挂载到容器中,显然是作为RW挂载(如果需要,也可以使用卷),比如/host_output/
1.在容器中,确保将构件保存在
/host_output/
中您的容器不会意识到发生了什么特别的事情,但当它天真地构建到“仅仅是一个目录”中时,文件也会“神奇”地出现在主机上。
如果您有一个现有的容器,其中不能修改
Dockerfile
,那么您可以使用类似docker exec foo_container cat /container_output/some_file.bin > /host_output/some_file.bin
的代码提取单个文件(>
不是docker exec
的一部分,它将在主机的外壳上运行)。这对于故障排除是最有用的,因为mount方法不那么繁琐,也不容易出错。