Docker制作dotnet core控制台程序镜像
Docker制作dotnet core控制台程序镜像
创建控制台程序
$ dotnet new console
The template "Console Application" was created successfully.
Processing post-creation actions...
Running 'dotnet restore' on D:\Mytest\TestDockerConsole0110\TestDockerConsole0110.csproj...
正在确定要还原的项目…
已还原 D:\Mytest\TestDockerConsole0110\TestDockerConsole0110.csproj (用时 146 ms)。
Restore succeeded.
$ dotnet run
Hello World!
Dockerfile文件:
什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
#定制基础镜像
FROM mcr.microsoft.com/dotnet/sdk:3.1 as build-env
#指定工作目录
WORKDIR /code
#将文件拷贝到容器目录中
COPY *.csproj /code/
#用于执行后面跟着的命令行命令
#dotnet restore(.net CLI):还原当前目录中项目的依赖项和工具
RUN dotnet restore
##将文件拷贝到容器目录中
COPY . /code/
#用于执行后面跟着的命令行命令
#dotnet publish(.net CLI):将应用程序及其依赖项发布到文件夹以部署到托管系统
# -c 和 -o 参数分别映射到 MSBuild 的 Configuration(定义生成配置) 和 PublishDir(所有项目的所有输出都会进入相对于当前工作目录的指定文件夹中) 属性
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/aspnet:3.1
WORKDIR /app
#从build-env阶段的中拷贝编译结果到当前镜像/app/中
COPY --from=build-env /code/out /app/
ENTRYPOINT ["dotnet","console.dll"]
docker build 命令用于使用 Dockerfile 创建镜像
#使用当前目录的 Dockerfile 创建镜像,标签为 console:dev
$ docker build -t console:dev .
#使用docker镜像console:dev 挂起进程100s
$ docker run console:dev sleep 100
Hello World from docker !
Thread.Sleep(Timeout.Infinite);//无限期挂起进程
Error处理
PS D:\Mytest\TestDockerConsole0110> docker run console:dev sleep 100
It was not possible to find any installed .NET Core SDKs
Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
https://aka.ms/dotnet-download
问题分析:DockerFile写的不对。找不到对应的运行程序
Docker中Dockerfile多From 指令存在的意义
每一条 FROM 指令都是一个构建阶段,多个From就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。