我正在学习Docker。我有一个使用.NET Core创建的控制台应用程序。该控制台应用程序具有一个Dockerfile。 Dockerfile看起来像这样:
FROM microsoft/dotnet:2.1-runtime AS base
FROM microsoft/dotnet:2.1-sdk
# Copy the compiled files
COPY . ./bin
ENTRYPOINT ["dotnet", "/bin/MyApp.dll"]
我有意要将已编译的文件复制到Docker映像中。由于依赖关系的问题,我不想在Docker映像上构建代码。不过,当我在Visual Studio中选择显示“ Docker”的播放按钮时,可以看到通过“ Output”窗口成功创建了图像。另外,我的控制台应用程序按预期将消息写入“输出”窗口。由于这些原因,我假设我的Dockerfile是正确的。
现在,我尝试从Visual Studio外部的命令行运行构建映像。在我的.csproj文件所在的目录中,运行docker build .
。当我这样做时,我看到以下内容:
Sending build context to Docker daemon 11.8MB
Step 1/4 : FROM microsoft/dotnet:2.1-runtime AS base
---> 59184f8be664
---> Using cache
---> 3a64d221c7f1
Step 2/4 : FROM microsoft/dotnet:2.1-sdk
---> 6691c7a1e6c7
Step 3/4 : COPY . ./app
---> e3e894ef7997
Step 4/4 : ENTRYPOINT ["dotnet", "/bin/MyApp.dll"]
---> Running in 355713fb3562
Removing intermediate container 355713fb3562
---> 88d4918847b9
Successfully built 78d4918847b8
然后我从命令行运行docker container run 78d4918847b8
,然后看到消息:
No executable found matching command "dotnet-/bin/MyApp.dll"
我不明白为什么我可以从Visual Studio运行图像,但不能从命令行运行图像。我在做什么错了?
答案 0 :(得分:0)
该错误消息实际上表示File not found
(请参见https://github.com/dotnet/core-setup/issues/1126,如@oneturkmen所建议)。
找不到文件的原因是因为您正在将文件复制到作为相对路径的./bin
,但是ENTRYPOINT
在/bin
中寻找的是绝对路径,相关到根文件夹。
如果您将DOCKERFILE更改为:
FROM microsoft/dotnet:2.1-runtime AS base
FROM microsoft/dotnet:2.1-sdk
# Copy the compiled files
COPY . ./bin
ENTRYPOINT ["dotnet", "./bin/MyApp.dll"]
然后它应该工作。请注意./bin
entrypoint