# DockerFileDemo
**Repository Path**: kesshei/DockerFileDemo
## Basic Information
- **Project Name**: DockerFileDemo
- **Description**: 一个.net 控制台和 web项目的dockerfile 实现项目
- **Primary Language**: C#
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2022-09-18
- **Last Updated**: 2023-04-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Docker 系列之 .Net Core 控制台和 Asp.net Core 服务生成镜像(DockerFile)
通过 Docker File 的方式来生成镜像,这个时候,镜像可以单独打包给对方,对方 Docker 加载了,就可以运行了。
通过对控制台应用以及 web 服务应用一起举例,会更容易参考。
## 新建 控制台应用和 web 服务
通过两种不同形态的程序来部署镜像
### 控制台应用
新建项目后,可以通过,项目右键,添加,docker 支持

直接 Linux 即可

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

我们,增加逻辑后
```csharp
///
/// 此服务,不能停
///
///
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 内容
```csharp
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"]
```
我在上面增加了三行代码,主要是解决时区和显示定义环境变量
```csharp
ENV TZ=Asia/Shanghai
ENV config=empty
ENV psw=empty
```
生成镜像的话,可以用 VS 自己的命令

十分的方便,不用敲命令,如果你想敲,大概如下:
```csharp
docker build -f "G:\git\03 自己的项目\DockerFileDemo\ConsoleApp1\Dockerfile" --force-rm -t consoleapp1 "G:\git\03 自己的项目\DockerFileDemo"
```
因为在 windows 上,所以,此命令指定了具体的 dockerfile 地址和最后的上下文地址,其他的跟正常的命令一致。
运行 docker 镜像为容器服务
```csharp
docker run --name test -e psw=123 -e config=配置 -it -d consoleapp1
```
执行以上方法就可以把容器运行起来

可以明显看到内容是符合我们预期的,也获取到了环境变量的相关配置信息。
如果默认不给环境变量,会是我们自己定义的值

控制台方案,就以环境变量为案例。
## web api 服务

添加后,默认就有 docker file 了,这docker file可以删除,然后,重新添加,如上
下面是我随便修改了一下逻辑
```csharp
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
[HttpGet]
public string Get()
{
var info = ConfigManage.GetSetting("conn");
return info;
}
}
```
然后,右键生成镜像
执行docker 命令
```csharp
docker run --name test1 -p 900:80 -it -d webapplication1
```
然后访问 http://127.0.0.1:900/home 即可看到效果

然后,执行以下命令
```csharp
docker run --name test1 -p 900:80 --mount type=bind,src=/d/dockerConfig/web/appsettings.json,dst=/app/appsettings.json -it -d webapplication1
```

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

# 总结
Visual Studio 真是好工具,我只能说太方便了,加上容器的功能,简直不要太到位。
不仅仅通过dockerfile创建了控制台的容器和web的容器,还解决了时区的问题,以及实现了服务器环境下的环境变量传参以及配置文件挂载传参。
# 阅
一键三连呦!,感谢大佬的支持,您的支持就是我的动力!
# 代码地址
https://github.com/kesshei/DockerFileDemo.git
https://gitee.com/kesshei/DockerFileDemo.git