根据本文档,Dockerfile的COPY指令应使用通配符。但当我尝试在Windows机器上构建下面的Dockerfile时,它会抛出一个";无效操作";而没有给出进一步的细节。
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
WORKDIR /app
COPY . ./
RUN dotnet build -c Debug -o out
RUN dotnet pack ./MyApp -c Debug
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-nanoserver-1809
WORKDIR /app
COPY --from=build /app/out .
COPY --from=build /app/MyApp/bin/Debug/*.nupkg .
ENTRYPOINT ["dotnet", "MyApp.dll"]
有问题的应用程序是一个简单的Hello World,我想用它来测试一些完全没有实现的东西,但这真的让我很困扰。我知道这个网站上的很多问题都提到了这一点,但似乎没有一个真正的答案来解释为什么文档中声明的这个功能不起作用。相反,答案要么说";文件说它是有效的"[插入奇怪的变通方法]";或";它是由其他一些错误引起的;。我也没有看到有人提到那个具体的错误。
更新
我已经将问题缩小到在多阶段构建中在两个图像之间复制文件。考虑以下Dockerfile:
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-nanoserver-1809 AS build
COPY *.txt ./
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-nanoserver-1809
COPY --from=build *.txt ./
如果您执行docker build,那么第一步就可以了,前提是您有一个与Dockerfile并行的.txt文件。然而,第二个步骤失败,出现无效的函数错误。如果您将星号替换为.txt文件的名称,它就可以工作了。
我无法复制您的mcve(使用busybox,因为它更小,而且我不在Windows上(。以下是我的命令输出,显示COPY命令按预期工作:
$ touch example.txt
$ vi Dockerfile
$ cat Dockerfile
FROM busybox as build
COPY *.txt ./
FROM busybox as release
COPY --from=build *.txt ./
$ docker build -t test-63706476 .
[+] Building 0.3s (7/8)
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 132B 0.0s
=> [internal] load metadata for docker.io/library/busybox:latest 0.0s
=> CACHED [build 1/2] FROM docker.io/library/busybox 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 32B 0.0s
=> [build 2/2] COPY *.txt ./ 0.1s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:ea328f739e7e795efb5c54ca4018b0ab56b52ae09016775f58097a5f8e6 0.0s
=> => naming to docker.io/library/test-63706476 0.0s
$ docker run -it --rm test-63706476 sh
/ # ls
bin etc home root tmp var
dev example.txt proc sys usr
/ # exit
您可以在上找到更多详细信息
https://forums.docker.com/t/dockerfile-copy-does-not-work-with-wildcard/95212