Dockerfile:将目录从Windows主机复制到docker容器

时间:2018-03-20 11:08:38

标签: docker

我想构建一个Docker镜像,包括我自定义的Powershell模块。因此,我使用Microsofts microsoft/powershell:latest图像,从我想要创建自己的图像,包括我的psm1文件。

对于简单测试,我有以下docker文件:

FROM microsoft/powershell:latest
RUN mkdir -p /tmp/powershell
COPY  C:/temp/somedirectory /tmp/powershell

我想将C:\ temp \ somedirectory中包含的文件复制到docker linux容器中。构建图像时出现以下错误:

  

C:\ TEMP \ docker_posh> docker build --rm -f Dockerfile -t docker_posh:latest。

     

将构建上下文发送到Docker守护程序2.048kB

     

Step 1/3:FROM microsoft / powershell:latest    ---> 9654a0b66645

     

步骤2/3:运行mkdir -p / tmp / powershell    --->使用缓存    ---> 799972c0dde5

     

步骤3/3:COPY C:/ temp / somedirectory / tmp / powershell   COPY失败:stat / var / lib / docker / tmp / docker-builder566832559 / C:/ temp / somedirectory:没有这样的文件或目录

当然我知道Docker说我找不到文件/目录。因此,我还尝试将C:/temp/somedirectory/.C:/temp/somedirectory/*C:\\temp\\somedirectory\\作为Dockerfile中的替代源路径 - >结果:他们都没有工作。

docker version
    Client:
       Version:       17.12.0-ce
       API version:   1.35
       Go version:    go1.9.2
       Git commit:    c97c6d6
       Built: Wed Dec 27 20:05:22 2017
       OS/Arch:       windows/amd64

    Server:
       Engine:
       Version:      17.12.0-ce
       API version:  1.35 (minimum version 1.12)
       Go version:   go1.9.2
       Git commit:   c97c6d6
       Built:        Wed Dec 27 20:12:29 2017
       OS/Arch:      linux/amd64
       Experimental: true

如何通过Dockerfile复制包含子文件夹和文件的文件夹?

3 个答案:

答案 0 :(得分:3)

构建docker镜像时,无法复制构建上下文之外的文件。构建上下文是您为docker build命令指定的路径。在指令

的情况下
C:\temp\docker_posh> docker build --rm -f Dockerfile -t docker_posh:latest .

.指定构建上下文为C:\temp\docker_posh。因此无法访问C:/temp/somedirectory。您可以将Dockerfile移动到temp,也可以运行相同的build命令 在C:\temp下。但请记住修复Dockerfile指令以使路径相对于构建上下文。

答案 1 :(得分:1)

如果要将某些东西从主机复制到运行的docker容器,那么可以使用docker cp命令,如:

docker cp [OPTIONS] CONTAINER_NAME:CONTAINER_SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER_NAME:CONTAINER_DEST_PATH

选项:

--archive      -a   Archive mode (copy all uid/gid information)
--follow-link  -L   Always follow symbol link in SRC_PATH

如果您不想使用选项,可以忽略它们。

答案 2 :(得分:1)

我发现此“功能”非常不便,只是编写了自己的构建脚本,该脚本将我关心的所有内容复制到新的temp文件夹中,然后在适当的上下文中构建docker映像。这是适用于任何发现此方法有用的人的Powershell脚本。

文件夹结构(随时可以更改)对我来说是这样的:

lib\somefile1.ps1
lib\somefile2.ps1
dockerfolder\Dockerfile
dockerfolder\mybuilderscript.ps1
my-main-file.ps1

这是脚本:

# Docker Image Tag Name
$tagname = "myimage"

#   Generate temp directory
$parent = [System.IO.Path]::GetTempPath()
[string] $name = [System.Guid]::NewGuid()
$dockerBuildDirectory = New-Item -ItemType Directory -Path (Join-Path $parent $name)

#   Copy things we care about from the parent repo into our build dir

# Copy source folder that has our Dockerfile (and this script) into a folder called "dockerworking" in the temp build directory
Copy-Item -Recurse "../dockerfolder" $dockerBuildDirectory/dockerworking

# Copy directories above our current folder into the dockerworking directory
Copy-Item -Recurse "../lib" $dockerBuildDirectory/dockerworking

# Copy the main script into the working directory
Copy-Item -Recurse "../my-main-file.ps1" $dockerBuildDirectory/dockerworking

# Let the user know where these files are for any troubleshooting that comes up
Write-Host -ForegroundColor Green "Docker files stage at $dockerBuildDirectory"

#   Create the docker image in the "dockerworking" folder where everything resides
docker build --no-cache --tag $tagname $dockerBuildDirectory/dockerworking

Dockerfile具有“本地” COPY命令(并且所有文件都已预先转移到正确的位置),因此Docker很高兴。

Dockerfile片段:

FROM mcr.microsoft.com/windows/servercore:ltsc2019

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]


RUN New-Item -Type Directory -Path "c:\scripts" | Out-Null
COPY "lib" "c:\scripts"
COPY "my-main-file.ps1" "c:\scripts"

ENTRYPOINT ["powershell", "-NoProfile", "-Command", "c:\\scripts\\my-main-file.ps1"]