Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)相关的知识,希望对你有一定的参考价值。
通过 Docker File 的方式来生成镜像,这个时候,镜像可以单独打包给对方,对方 Docker 加载了,就可以运行了。
通过对控制台应用以及 web 服务应用一起举例,会更容易参考。
新建 控制台应用和 web 服务
通过两种不同形态的程序来部署镜像
控制台应用
新建项目后,可以通过,项目右键,添加,docker 支持
![null](https://image.cha138.com/20220924/847ad94192f041dfbb5207df252de832.jpg)
直接 Linux 即可
![null](https://image.cha138.com/20220924/28a4fe1395fc4fa38f2593d1447ef365.jpg)
然后,查看就有一个 dockerfile 文件
![null](https://image.cha138.com/20220924/bbb63d0e7bd44eb0900698733c6c4f9b.jpg)
我们,增加逻辑后
/// <summary>
/// 此服务,不能停
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
//获取环境变量
var env = ConfigManage.GetSetting("config");
var psw = ConfigManage.GetSetting("psw");
Log.Info($"获取环境变量 config:env psw:psw");
Task.Run(() =>
while (true)
Log.Info("自动执行");
Thread.Sleep(5000);
);
Console.ReadLine();
DockerFile 内容
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["ConsoleApp1/ConsoleApp1.csproj", "ConsoleApp1/"]
COPY ["Common/Common.csproj", "Common/"]
RUN dotnet restore "ConsoleApp1/ConsoleApp1.csproj"
COPY . .
WORKDIR "/src/ConsoleApp1"
RUN dotnet build "ConsoleApp1.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "ConsoleApp1.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
ENV TZ=Asia/Shanghai
ENV config=empty
ENV psw=empty
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "ConsoleApp1.dll"]
我在上面增加了三行代码,主要是解决时区和显示定义环境变量
ENV TZ=Asia/Shanghai
ENV config=empty
ENV psw=empty
生成镜像的话,可以用 VS 自己的命令
![null](https://image.cha138.com/20220924/4625d700a67541d09588169f0a697b52.jpg)
十分的方便,不用敲命令,如果你想敲,大概如下:
docker build -f "G:\\git\\03 自己的项目\\DockerFileDemo\\ConsoleApp1\\Dockerfile" --force-rm -t consoleapp1 "G:\\git\\03 自己的项目\\DockerFileDemo"
因为在 windows 上,所以,此命令指定了具体的 dockerfile 地址和最后的上下文地址,其他的跟正常的命令一致。
运行 docker 镜像为容器服务
docker run --name test -e psw=123 -e config=配置 -it -d consoleapp1
执行以上方法就可以把容器运行起来
![null](https://image.cha138.com/20220924/68f1ce6bde5c478c8c294909b903d3c8.jpg)
可以明显看到内容是符合我们预期的,也获取到了环境变量的相关配置信息。
如果默认不给环境变量,会是我们自己定义的值
![null](https://image.cha138.com/20220924/182b62fb66ca4f05a742881e4e615474.jpg)
控制台方案,就以环境变量为案例。
web api 服务
![null](https://image.cha138.com/20220924/b587a193eda54b93b022097bada02d0f.jpg)
添加后,默认就有 docker file 了,这docker file可以删除,然后,重新添加,如上
下面是我随便修改了一下逻辑
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
[HttpGet]
public string Get()
var info = ConfigManage.GetSetting("conn");
return info;
然后,右键生成镜像
执行docker 命令
docker run --name test1 -p 900:80 -it -d webapplication1
然后访问 http://127.0.0.1:900/home 即可看到效果
![null](https://image.cha138.com/20220924/24606d20e7454740a66f8d7fe21f906a.jpg)
然后,执行以下命令
docker run --name test1 -p 900:80 --mount type=bind,src=/d/dockerConfig/web/appsettings.json,dst=/app/appsettings.json -it -d webapplication1
![null](https://image.cha138.com/20220924/2546b4bdf9514b72898fc8c98b7c833e.jpg)
命令实现了对 以下路径 配置文件的挂载 mount
![null](https://image.cha138.com/20220924/d232c7644bc743bda6f27b8f61cfeca2.jpg)
总结
Visual Studio 真是好工具,我只能说太方便了,加上容器的功能,简直不要太到位。
不仅仅通过dockerfile创建了控制台的容器和web的容器,还解决了时区的问题,以及实现了服务器环境下的环境变量传参以及配置文件挂载传参。
阅
一键三连呦!,感谢大佬的支持,您的支持就是我的动力!
代码地址
https://github.com/kesshei/DockerFileDemo.git https://gitee.com/kesshei/DockerFileDemo.git
以上是关于Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)的主要内容,如果未能解决你的问题,请参考以下文章
asp.net core 系列之Dependency injection(依赖注入)
asp.net core 系列6 实战之 一个项目的完整结构
ASP.NET Core分布式项目实战Docker制作dotnet core控制台程序镜像