Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

通过 Docker File 的方式来生成镜像,这个时候,镜像可以单独打包给对方,对方 Docker 加载了,就可以运行了。

通过对控制台应用以及 web 服务应用一起举例,会更容易参考。

新建 控制台应用和 web 服务

通过两种不同形态的程序来部署镜像.

控制台应用

新建项目后,可以通过,项目右键,添加,docker 支持

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

直接 Linux 即可

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

然后,查看就有一个 dockerfile 文件

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

我们,增加逻辑后

    /// <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 自己的命令

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

十分的方便,不用敲命令,如果你想敲,大概如下:

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

执行以上方法就可以把容器运行起来

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

可以明显看到内容是符合我们预期的,也获取到了环境变量的相关配置信息。

如果默认不给环境变量,会是我们自己定义的值

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

控制台方案,就以环境变量为案例。

web api 服务

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

添加后,默认就有 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 即可看到效果

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

然后,执行以下命令

docker run --name test1  -p 900:80 --mount type=bind,src=/d/dockerConfig/web/appsettings.json,dst=/app/appsettings.json -it -d webapplication1
Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

命令实现了对 以下路径 配置文件的挂载 mount

Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)

总结

Visual Studio 真是好工具,我只能说太方便了,加上容器的功能,简直不要太到位。

不仅仅通过dockerfile创建了控制台的容器和web的容器,还解决了时区的问题,以及实现了服务器环境下的环境变量传参以及配置文件挂载传参。

一键三连呦!,感谢大佬的支持,您的支持就是我的动力!

代码地址

https://github.com/kesshei/DockerFileDemo.git

https://gitee.com/kesshei/DockerFileDemo.git