我想构建一个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复制包含子文件夹和文件的文件夹?
答案 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"]