1. 程式人生 > >Docker入門系列02

Docker入門系列02

create sha 本地 新的 uil 自信 from creat new

上篇用一個簡單的示例,簡單的介紹了 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