直接以指令將 .NET Core 打包成 Docker

.NET Core 除了可以在 Windows、macOS 與 Linux 執行外,更可以直接打包成 Docker image 發布。

Version


macOS High Sierra 10.13.3
Docker for Mac 17.20.0-ce-mac49 (21995)
.NET Core SDK 2.1.4

建立 Console App


1
$ dotnet new console -o MyConsole

使用 .NET Core SDK 建立 console app。

  • new : 建立 project
  • console : 建立 console 類型 project
  • -o : 以 MyConsole 為專案名稱並建立目錄

docker000

  1. 輸入 dotnet new console -o MyConsole 建立 MyConsole 專案,其專案類型為 console app

建立 Dockerfile


由於我們想要建立自己的 Docker image,因此要建立自己的 Dockerfile,Docker 才能依照此 Dockerfile 建立自己的 image。

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
FROM microsoft/dotnet
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and build everything else
COPY . ./
RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "out/MyConsole.dll"]

第 1 行

1
FROM microsoft/dotnet

FROM 為 Dockerfile 指令,表示以哪一個 image 為基礎建立自己的 image。

其中 microsoft/dotnet 是專為 console app 所設計的 image。

以上表示將以 microsoft/dotnet image 為基礎建立自己的 console app image。

第 2 行

1
WORKDIR /app

WORKDIR 為 Dockerfile 指令,表示其他 Dockerfile 指令 (如 RUNCMDENTRYPOINTCOPYADD …等) 的工作目錄。

以上表示 WORKDIR/app,若 /app 目錄不存在會自動建立。

第 5 行

1
COPY *.csproj ./

COPY 為 Dockerfile 指令,表示將 host 的檔案或目錄,複製到 container 的目錄。

第 1 個參數為 host 檔案或目錄,第 2 個參數為 container 目錄。

以上表示將目前目錄下的 project 檔複製到 container 目錄下。

第 6 行

1
RUN dotnet restore

RUN 為 Dockerfile 指令,表示將在 container 內執行指令。

以上表示將根據 *.csproj 將所有 NuGet package 加以 restore,並寫入新的 image。

第 9 行

1
COPY . ./

COPY 為 Dockerfile 指令,表示將 host 的檔案或目錄,複製到 container 的目錄。

以上表示將目前目錄下所有檔案複製到 container 目錄下。

第 10 行

1
RUN dotnet publish -c Release -o out

RUN 為 Dockerfile 指令,表示將在 container 內執行指令。

  • -c : configuration,若省略將使用 Debug 模式編譯,若要在 production 使用,要使用 Release 模式編譯
  • -o : 將 publish 結果寫在專案的 out 目錄

以上表示將執行 dotnet publish 指令,使用 Release 模式編譯,並將 publish 結果寫在專案的 out 目錄下。

11 行

1
ENTRYPOINT ["dotnet", "out/MyConsole.dll"]

ENTRYPOINT 為 Dockerfile 指令,表示 container 一啟動時,該執行什麼指令。

以上表示當 container 一啟動時,將執行 dotnet out/MyConsole.dll

docker002

  1. 在專案根目錄下建立 Dockerfile

建立 Image

1
~/MyProject $ docker build -t my/image .

使用 docker buildDockerfile 建立 image。

  • -t : tag,image 的名稱

以上表示將目前目錄的 Dockerfile 建立成 image。

docker001

  1. 輸入 docker build -t my/image . 將整個專案建立成 my-image

執行 Container


1
~/MyProject $ docker run --rm my/image

使用 docker run 建立 container 並執行之。

  • –rm : 執行完後立即刪除 container

以上表示將 my/image 建立成 container 後,立即執行,執行完立即刪除 container,但 image 仍然保留。

docker003

  1. 輸入 docker run --rm my/image 執行 container,將顯示 Hello World

Conclusion


  • 將 .NET Core console app 打包成 Docker image 後,就可以跨平台執行此 image
  • 此範例雖然是 console app,事實上將 ASP.NET Core 打包成 Docker image 也是類似以上流程

Sample Code


完整的範例可以在我的 GitHub 上找到

Reference


.NET Core, Learn Docker Basics with .NET Core

2018-02-26