上篇用一个简单的示例,简单的介绍了 Dockerfile 的配置及其相关的命令。这一篇会在上篇的示例程序里,继续添加新代码及如何将单元测试也放入 Image 建立过程内。

首先,我们需要建一个新的类库,将业务相关的代码从原来的项目移到新类库里。创建类库的代码如下:

dotnet new classlib -o utils
dotnet restore utils/
dotnet sln add utils/utils.csproj

现在我们已经创建好了新的类库,那么现在coding……,我会在文章末尾放入项目地址。假设你十指如飞的敲好了代码。OK,虽然我们对自己的代码很自信,但为了体现我们对代码的负责的态度,还是需要写个单元测试的。OK,我们需要创建个单元测试项目,非常简单,代码如下:

dotnet new xunit -o test

现在coding单元测试用例,5分钟后代码写好了,现在本地运行下,命令如下:

dotnet test ./tests/
#以下是test运行结果
Build started, please wait...
Build completed. Test run for /Users/gebilaowang/Development/dotnet-docker/dotnetapp/tests/bin/Debug/netcoreapp2.0/tests.dll(.NETCoreApp,Version=v2.0)
Microsoft (R) Test Execution Command Line Tool Version 15.5.0
Copyright (c) Microsoft Corporation. All rights reserved. Starting test execution, please wait...
[xUnit.net 00:00:00.7581900] Discovering: tests
[xUnit.net 00:00:00.8340440] Discovered: tests
[xUnit.net 00:00:00.8412310] Starting: tests
test text 1
test text 2
test text 3
test text.
[xUnit.net 00:00:01.0264220] Finished: tests Total tests: 3. Passed: 3. Failed: 0. Skipped: 0.
Test Run Successful.
Test execution time: 1.8490 Seconds

到现阶段,单元测试相关的代码已经写好了,那么该进入主题了,修改 Dockerfile 内容如下:

FROM microsoft/dotnet:2.0-sdk AS build

# copy csproj and restore as distinct layer
WORKDIR /src
COPY *.sln .
COPY dotnetapp/*.csproj ./dotnetapp/
COPY tests/*.csproj ./tests/
COPY utils/*.csproj ./utils/
RUN dotnet restore # copy and build everything else
COPY . .
RUN dotnet build # create test
FROM build AS test
WORKDIR /src/tests
RUN dotnet test # publish execution app
FROM build AS publish
WORKDIR /src/dotnetapp
RUN dotnet publish -c Release -o out #
FROM microsoft/dotnet:2.0-runtime as runtime
WORKDIR /app
COPY --from=publish /src/dotnetapp/out ./
ENTRYPOINT [ "dotnet","dotnetapp.dll" ]

OK,现在可以创建新的 Image 了,键入 docker build -t dotnetapp:1.0-test .,这个过程相对第一次比较快,因为相关的基础镜像(BaseImage)之前已经下载到本地了。注意观察 Image 的过程,你会发现单元测试的输出结果。

OK,有关单元测试的内容已经介绍完了,是不是很简单。聪明的你,也许想到了是不是也可以将单元测试作为容器启动的入口程序,你可以自己动手试试。

示例代码

Docker入门系列02的更多相关文章

  1. Docker入门系列(一):目标和安排

    Docker入门系列(一) 这个系列的教程来源于docker的官方文档,此文档的目的在于一步一步学习docker的使用方法. 这一系列的教程有如下几篇文档: docker安装启动 构建第一个docke ...

  2. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  3. Docker入门系列1:简介

    可以实现快速部署. 比如一台 16 核 32G 内存的虚拟机上,需要跑 500+ 个用户的应用(每个应用的功能可以认为是一个网站 + 一系列的 RESTful API),有两个事情很重要: 资源隔离: ...

  4. Docker入门系列3:使用

    入门 首先强烈建议玩一遍官方的入门教程,Interactive commandline tutorial,下面是答案: 查看版本:docker version 搜索Image:docker searc ...

  5. Docker入门系列之五:15个 Docker 命令

    在这篇文章中,我们将学习15个Dockers CLI命令.如果你还不了解Docker,请查看这个系列的其他部分进行学习,Docker概念,生态系统,Dockerfile,Docker镜像. Docke ...

  6. Docker入门系列之二:使用dockerfile制作包含指定web应用的镜像

    实现题目描述的这个需求有很多种办法,作为入门,让我们从最简单的办法开始. 首先使用命令docker ps确保当前没有正在运行的Docker实例. 运行命令docker run -it nginx: 然 ...

  7. Docker入门系列之一:在一个Docker容器里运行指定的web应用

    实现题目描述的这个需求有很多种办法,作为入门,让我们从最简单的办法开始. 首先使用命令docker ps确保当前没有正在运行的Docker实例. 运行命令docker run -it nginx: 然 ...

  8. Docker入门系列2 安装

    可以从 Docker 社区直接下载可用的模版或镜像. Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多. 其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Do ...

  9. Docker入门系列之二:Docker术语

    原文作者:Jeff Hale 原文地址:https://towardsdatascience.com/learn-enough-docker-to-be-useful-1c40ea269fa8 翻译: ...

随机推荐

  1. SAP CRM系统订单模型的设计与实现

    SAP成都研究院的一个部门领导让我给他的团队做一个SAP CRM One Order框架的培训,这是我准备的培训内容. 在Jerry之前的文章 基于SAP Kyma的订单编排增强介绍,我表达了自己对S ...

  2. JavaScript的DOM_节点类型的扩展

    DOM 自身存在很多类型,比如 Element 类型(元素节点)再比如 Text 类型(文本节点).DOM 还提供了一些扩展功能. 一.Node类型 Node 接口是 DOM1 级就定义了,Node ...

  3. MQ--API总结

    研究MQ很长时间了, 每个类,方法,都查了很长时间,在此总结一下! Java编写访问MQ的程序 1.MQQueueManager―――队列管理器访问类  常用方法: public MQQueueMan ...

  4. Oracle表空间、段、区和块简述

    本文转载自:http://blog.itpub.net/17203031/viewspace-682003/ 在Oracle学习过程中,存储结构,表段区块可能是每个初学者都要涉及到的概念.表空间.段. ...

  5. .net 基础(一)

    方法 只需要考虑2个 东西 1. 方法的参数  2.方法的返回值 当参数的个数不确定的时候,可以采用可变参数params. params 数组的 个数,不确定.当传入的 参数为空的时候,可变参数的数组 ...

  6. select下拉框之默认选项清空

    最近和小伙伴发现,select默认选项一般是提示信息,怎么才能让当我们点击下拉框时,可选的选项中没有默认的提示信息呢? 思路: 1.当点击下拉框时,让默认提示信息,即下拉框第一个选项移除. 2.当没有 ...

  7. 集合HashMap和HashSet中迭代器的使用

    package setTest; import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import ...

  8. Google Performance工具,你还不会用?Git走起。

    2018俄罗斯世界杯如火如荼的进行中,第一轮各种冷门,让大家的确大跌眼界,尤其是那些买球的同志们,慌得一笔,还敢继续买吗?话说来,看球归看球,学习还是不能落下,我们来学习Chrome Devtool ...

  9. 三、Hadoop 的 API

    1.环境搭建 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop- ...

  10. 『ACM C++』 Codeforces | 1003C - Intense Heat

    今日兴趣新闻: NASA 研制最强推进器,加速度可达每秒 40 公里,飞火星全靠它 链接:https://mbd.baidu.com/newspage/data/landingsuper?contex ...